#そのようです>mbedtls
#こっちでも試してみます。
#Gauche で、任意個の引数を取れる手続から、アリティを固定数に制限した手続を作るには、どうすればよいでしょう?(ブランクがありすぎて全然鼻が効かない状態です)
#MIT-Scheme で
(define (restrict-arity proc nargs)
(hash-table-set! arity-table proc nargs)
proc)
と定義されている、restrict-arity を Gauche で定義することを考えています。
#Software Design for Flexibility にそんな例がありましたねー。
#ああ。まさにそれです。
#listから引数を3つに制限したlist3を作るようなことってあまりlisp的にやらない気がする(メリットがなさそう)のですが、どういう場所で活躍するのでしょう?(コンパイル時のチェックを期待など?)。 引数の個数チェックということだと、((lambda (a b c) (list a b c)))と書けばよさそうですが……
#などと思いましたが、Software Design for Flexibilityにある例なのですね。用途が思考実験ということならmit schemeのコードはポータブルに見えます。
#アリティをポータブルにプログラム内で取得するのが肝ということだと、srfiに何度か提案されていますが、没になってるみたいです。 https://srfi.schemers.org/srfi-191/srfi-191.html #アリティを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 と等しくなるのが合併型と理解しています。