Schemeで多値を受け取る継続を補足できないか(できなかった)
Schemeは今R6RSがスタンダードだそうですが、私はR5RSでさえ追いつけていません。
そんな渡しですが、Schemerのマジックワード、多値と継続について時々妄想していまうのです。
多値・・・
関数が複数個の引数をとることができるんだから、関数の返り値が1個だけなんて、美しくないよね!
ってな感じでSchemeに導入された「多値」。
そのコアになるプリミティブは次の通り。
(values v1 ... vn)
で、n個の値を返すと。
(call-with-values (lambda () ... (values v1 ... vn)) (lambda (a1 ... an) body))
で、 (lambda () ... (values v1 ... vn))の返り値 v1 ... vn が a1 ... an に束縛されて body が評価されると。
実際にはこれらの糖衣構文でプログラムするんだそうな。
call-with-values の中の継続
ここで、(lambda () ... (values v1 ... vn))からの返り値が(lambda (a1 ... an) body)にわたる過程を見れば、
call-with-values の中にある (lambda () ... (values v1 ... vn)) の計算結果を受け取る「継続」が、
多値を受け取る継続だろうなという推測ができるわけです。
すなわち、この継続は、
(lambda () ... (values v1 ... vn))の計算結果である値を複数受け取り、
「受け取った複数の値・多値を、引数に組み替え」て、(lambda (a1 ... an) body)に渡す
というものであったりします。
継続って通常値を1個受け取るものでありますが、call-with-values内においては、複数の値を受け取る継続が一瞬現れるように見えます。
じゃ複数の値を受け取る継続の補足ができるかな?
ということで少し考えてみることにします。
(define k '()) -> unspecified (call-with-values (call/cc (lambda (c) (set! k c) (lambda () (values 1 2)))) (lambda (a b) (list a b))) ->(1 2) (k (values 3 4)) ->?????
kに多値を受け取る継続を捕捉させたいんだけど、このコードで捕捉される継続は、thunkを受け取る継続なんだよなぁ。
うまく多値を受け取る継続を補足できないかなぁ。
っていうか、捕捉できないように吟味して call-with-values とか考えたのかな。
わからん。
オチなし
なんじゃこりゃ。今日は何だかしっちゃかめっちゃかだな、