#アリティをnargsで与えたいなら、マクロにするか、一旦可変長で受け取ってランタイムに引数の数をチェックするかですかねえ。
#マクロ展開時にnargsがわかるならマクロが実用的には良いと思うんですが。
##実装より先に考えることいろいろありそう。そちらをもうすこし整理してみようと思います。
#Gauche Scheme 800 Star おめでとうございます。(変動はあるでしょうが…)
#ありがたや。目指せ1000 (いつになるやら)
#(use gauche.generator)
(define (restrict-arity proc n)
(let ((argument-list (generator->list gensym n)))
((eval
`(lambda (p)
(lambda ,argument-list
(p ,@argument-list)))
(find-module 'gauche))
proc)))
(define (foo . p) "foo") ; 可変長の手続き
(define bar (restrict-arity foo 3)) ; アリティを制限
(bar 1 2 3) ; これは OK
(bar 1 2 3 4) ; これは NG
#こんな感じかな?
#ああ、確かにそのevalの使い方は安全ではありますね。でもevalかあ…
#うっかり変な initialize 定義したら^C連打でも返ってこない状態になっちゃいました。initialize 書くの久しぶりだったので…。
#$ gosh
gosh$ (define-method initialize (self args) (next-method) (slot-ref self 'foo))
^C^C^C
^Z
[1]+ Stopped gosh
#$ gosh
gosh$ (define-method initialize (self args) (error "foo"))
^C^C^C^C^C^C^C^CReceived too many signals before processing them. Exitting for the emergency...
#もうちょっと簡単にできるかと思ったけどこれだとtoo many signalsは効きますね
#$ gosh
gosh$ (define-method initialize (self args) (slot-ref self 'foo))
^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C
^Z
[1]+ Stopped gosh
#あー <top> へのメソッド定義になるからあらゆるオブジェクト作成時に呼ばれちゃうんだな。基本オブジェクトのnitializeはロックした方がいいな。
#Testing rfc.tls ... gosh(1507,0x70000b52b000) malloc: *** error for object 0x102302080: pointer being freed was not allocated
gosh(1507,0x70000b52b000) malloc: *** set a breakpoint in malloc_error_break to debug
#0.9.15のmake checkでこけました。対応するテストはext/tls/test.{scm,log}であってますか?test poll (10)まで全部通ってるように見えます。
#もう一回make checkしたら通りました。
#tlsのテスト、たまにfailするんですよね。気にはなってるんですが再現できない
#mail
#"don't import r7rs"ってことでモジュール r7rs は r7rs-setup に改名したそうですが、リファレンスに (use r7rs) って書いちゃってます: http://practical-scheme.net/gauche/man/gauche-refj/R7RSTong-He-.html#R7RS_7d71_5408 #リファレンスといえば型コンストラクタの </> の所も気になってて、"type … の直和型を作ります" とありますが、これ直和型(sum type)じゃなくて合併型(union type)だと思うんですよね。(Sum T T) としたときにタグ付けしてそれぞれのTが区別できるTと異なる型になるのが直和型、(Union T T) が T と等しくなるのが合併型と理解しています。
#@kaki メッセージ気づいてませんでした。
#確かにあんまり考えてなかったな…部分型関係から見たらUnion typeです。ただ、型オブジェクト <T> と (</> <T> <T>) は今のところ同一にならない
#test
#しばらくBlueSky bridgeが止まってました。復活。
#同一のオブジェクトになるかどうかはともかく、(subtype? T (</> T T)) かつ (subtype? (</> T T) T)) になってほしさがあります。
#gosh> (subtype? <char> (</> <char> <char>))
#t
gosh> (subtype? (</> <char> <char>) <char>)
#f
gosh> (subtype? (</> <integer> <float>) <number>)
#f
#全部 #t を期待したのですが、何かおかしいですか?
#gosh> (subtype? <number> <float>)
#<undef>
gosh> (subtype? (</> <integer> <real>) <number>)
#f
#<float> がうっかりnative typeのやつだったのと別のバグがありそうなので、<real> で
#<float> のは
- [(SCM_NATIVE_TYPE_P super) (return FALSE)]
+ [(SCM_NATIVE_TYPE_P super) (return SCM_FALSE)]
かしら
#(subtype? (</> <number>) <number>) みたいなケース、(:subtype? (</> <number>) <number>) が呼ばれて 'super が返る -> (delegate-to-super (</> <number>) <number>) で (SCM_DESCRIPTIVE_TYPE_P <number>) が #f で (</> ...) の中身によらず #f になっちゃってます?
#gosh> (slot-set! </> 'subtype? (^[type super] (if (or (is-a? super </>) (is-a? super <class>)) (every (cut subtype? <> super) (~ type'members)) 'super)))
#<undef>
gosh> (subtype? <char> (</> <char> <char>))
#t
gosh> (subtype? (</> <char> <char>) <char>)
#t
gosh> (subtype? (</> <integer> <real>) <number>)
#t
gosh> (subtype? (</> <integer>) <number>)
#t