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 次はなんだ) ; すっきり
こうかな。
コードリーディングの課題にしとこう。