( (call/cc call/cc) (call/cc call/cc) )
http://www.coins.tsukuba.ac.jp/~i021216/diary/?date=20070614#p01
えーと(混乱中)
まず(call/cc call/cc)を考える。この呼び出しはこの式を評価した直後への継続c1を作成し、それを引数(すなわちcall/cc)へ適用する。
(call/cc call/cc) ;ここがc1
↓
(call/cc c1) ;ここがc1
この呼び出しは、継続c1を作成し引数(すなわちc1)に適用する、ということはこの式全体の値は継続c1となる。
つぎ。
式 (exp1 exp2) を評価するには、
- リストの各要素を評価する
- exp1を評価
- exp2を評価
- exp1の値にexp2の値をapply
という順序で、exp1,2の評価順序はunspecified。たぶんどっちが先でも最終的な結果は変わらない気がするが、両方やってみる。
exp1が先の場合
- リストの各要素を評価する
- exp1を評価
- ここが継続c1
- exp2を評価
- ここが継続c2
- exp1を評価
- exp1の値にexp2をapply
exp1,2はそれぞれ(call/cc call/cc)なので、exp1の値は継続c1、exp2の値は継続c2である。c1にc2を適用すると…… どうなるんだ。c1に渡された値がexp1の評価結果とみなされる、という理解でいいのかな。とすればexp1,2の値はともに継続c2となる。
そして3.でc2にc2を適用→exp2の評価直後に飛ばされる→exp2の値はc2のまま変わらず→c2にc2を適用→exp2の評価直後に飛ばされる→無限ループ
exp2が先の場合
- リストの各要素を評価する
- exp2を評価
- ここが継続c1
- exp1を評価
- ここが継続c2
- exp2を評価
- exp1の値にexp2をapply
exp2の値は継続c1、exp1の値は継続c2となる。c1にc2を適用すると(結局は以下同文
というわけで、( (call/cc call/cc) (call/cc call/cc) )は評価順序によらず無限ループすることが納得いきましたおわり