08/05/31 00:11:22
λ式中の束縛識別子はそのλ式がapplyされた時に動的に生成されるCで言えばauto変数。
だから再帰などで同じ手続きが呼ばれてもそれぞれの変数の束縛(アドレス)はユニーク。
λ式中の自由識別子はそのλ式がevalされ(て手続きが生成され)た時に可視な束縛(ポインタ)が参照される。
だから再帰などで同じ手続きがよばれても同一の場所(アドレス)を参照する。
call/ccが引数の手続きに渡す継続は
case-Aの場合は(lambda (x) (write counter) (newline) (loop (+ counter 1)))
case-Bの場合は(lambda (x) (write counter) (newline) (set! counter (+ counter 1)) (loop counter))
この中に現れている自由識別子(というか束縛識別子は参照されてないけど)は何度呼ばれても同一の場所を参照する。
case-Bの場合はset!でcounterが束縛されているメモリの値を書き換えてるから
書き換えられた値を参照している。
ここで(loop (+ counter 1))は手続き呼び出しだから(loop 3)等の値に評価されてから手続きに渡されている事に留意。
そして1回目のloopのcounterと2回目のloopのcounterは同一でない場所を参照してる。(スタックフレームの再利用などの最適化されていなければ)