寄り道継続。処理系による?
schemeの継続について、今把握してることのメモ。
ざっくりとしたもの。
- 継続とは、call/ccが置かれた、その次の処理。
call/ccはそれを、継続という関数的なものにする。
- 継続に渡されるのは、call/ccに入った瞬間の環境
言ってみればスナップショット。だから、どのS式が評価済みで、どれが未評価か見分ける必要がある。
その時点で未評価な、継続内で参照されるs式の値は、変化しうる。
- call/ccはcall-with-input-fileとかと同じcall系の関数
その中で、渡すものが継続というタイプの関数である、というだけのこと。
- call/ccが値を返し、それが次の処理で使われる文脈なら、継続を呼び出す時には、それに相当するものを引き数で渡す。
で、確認のために、まずは下のようなコードを書いて動かしてみる。
#!/usr/local/bin/gosh ;;継続 (define kz #f) (begin (print "start") (newline) (call/cc (lambda (cc) (set! kz cc) (print "call/cc") (newline))) (print "after call/cc") (newline)) (print "outer begin") (newline) (kz)
ここでいきなり引っかかった!
gaucheで試すと、「outer begin」の後、」最後に「after call/cc」が表示されて、call/cc直後の「(print "after call/cc")」からが継続になってるのが分かる。
でも例えば、codepadで試すと、それが表示されない。
http://codepad.org/b5OBTxYb
手元のDr.Schemeの「pretty big」で試しても同じ。
なんで?