( (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) を評価するには、

  1. リストの各要素を評価する
    • exp1を評価
    • exp2を評価
  2. exp1の値にexp2の値をapply

という順序で、exp1,2の評価順序はunspecified。たぶんどっちが先でも最終的な結果は変わらない気がするが、両方やってみる。


exp1が先の場合

  1. リストの各要素を評価する
    1. exp1を評価
      • ここが継続c1
    2. exp2を評価
      • ここが継続c2
  2. 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が先の場合

  1. リストの各要素を評価する
    1. exp2を評価
      • ここが継続c1
    2. exp1を評価
      • ここが継続c2
  2. exp1の値にexp2をapply

exp2の値は継続c1、exp1の値は継続c2となる。c1にc2を適用すると(結局は以下同文


というわけで、( (call/cc call/cc) (call/cc call/cc) )は評価順序によらず無限ループすることが納得いきましたおわり