継続は多値で返ってくる
継続を呼び出すと,継続に渡された変数は”多値”で返ってくる.
そのため,receiveを使わなければ,すべてを受け取ることはできない(と思われる).
以下の簡単プログラムで実証してみた.
(define cont #f) (receive (a b) (call/cc (lambda (c) (set! cont c) (min&max 3 1 2))) (list a b)) :=> (1 3) (cont 4 5) :=> (4 5)
これに気がついたきっかけは,「簡易な例外機構(プログラミングGauche P.292)」をいろいろいじくっていたときの,debug-print表示を見たとき.
多値を返すところに#?=を使うと,以下のようになる.
(receive (a b) #?=(call/cc (lambda (c) (set! cont c) (min&max 3 1 2))) (list a b)) :評価結果 gosh> #?="(stdin)":320:(min&max 3 1 2) #?- 1 #?+ 3 (1 3) gosh> (cont 4 5) #?- 4 #?+ 5 (4 5)
このように#?+となる.多値でない場合は#?-で表示される.