call/ccに関する疑問

call/ccで使われなかった部分はどこに行ってしまうんだろう。という疑問。

Karetta|Gaucheプログラミング(立読み版)|継続渡しスタイルより。


(* 2)を使わないで継続を実行する。

(call/cc (lambda (cont)
           (* 2 (cont 10)))) ; 10

contの中には、PRINT-AND-NEXT-REPLという継続が入っているので、

(call/cc (lambda (PRINT-AND-NEXT-REPL)
           (* 2 (PRINT-AND-NEXT-REPL 10)))) ; 10

PRINTで10と表示される。そしたら、NEXTを実行して、

(* 2 (REPL 次はなんだ))

と待っている状態になる。

(* 2)よりもREPLの方が先に評価されるので、ジャンプしている「ように」見える。(* 2)は永久に評価されることが無いだけ。これがcall/ccのカラクリ。

しかし、(* 2)はゴミとして永久に残っちゃうんじゃないのか。と思ってみたわけ。

うぅん。


予測:

お、REPLが来たらそれ以前の継続は全部削除しちゃうとか。

(* 2 (NEXT-REPL 次はなんだ))
     V
(* 2)はいらないので削除。
     V
(REPL 次はなんだ) ; すっきり

こうかな。


コードリーディングの課題にしとこう。