test/dynwind.scm (2)

なんだこれは。こんな試験がある。

;; continuation with multiple values

(test* "call/cc (values)" '(1 2 3)
       (receive x (call-with-current-continuation
                   (lambda (c) (c 1 2 3)))
         x))

ええと、receive の構文は

(receive <名前のリスト> <多値を返す式> <本体>)

とある。上記の例だと x で多値をまとめて受けとってそれを戻す形になるはず。で、多値を戻す手続きが

(call-with-current-continuation
                   (lambda (c) (c 1 2 3)))

になる模様。ちなみに上記を gosh で評価したら以下

gosh> (call/cc (lambda (c) (c 1 2 3)))
1
2
3
gosh>

なんで上記の式が多値を戻すのか、が分からんな。c にセットされるのは values なんでしょうか。

gosh> (call/cc (lambda (c0) (set! c c0) (c 1 2 3)))
1
2
3
gosh> c
#<subr continuation>
gosh> (c)
#<undef>
gosh> (c 1 2)
1
2
gosh> (values 1 2)
1
2
gosh> 

うーん。ビンゴで良いのかどうなのか。disasm してみましたが分かる訳もなし。