さかもとのブログ

つらつらと

継続は多値で返ってくる

継続を呼び出すと,継続に渡された変数は”多値”で返ってくる.
そのため,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)

このように#?+となる.多値でない場合は#?-で表示される.