- 221 名前:デフォルトの名無しさん mailto:sage [2008/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は同一でない場所を参照してる。(スタックフレームの再利用などの最適化されていなければ)
|

|