proglog

主にプログラミングに関する断片的メモ

寄り道継続。処理系による?

schemeの継続について、今把握してることのメモ。
ざっくりとしたもの。

  1. 継続とは、call/ccが置かれた、その次の処理。

call/ccはそれを、継続という関数的なものにする。

  1. 継続に渡されるのは、call/ccに入った瞬間の環境

言ってみればスナップショット。だから、どのS式が評価済みで、どれが未評価か見分ける必要がある。
その時点で未評価な、継続内で参照されるs式の値は、変化しうる。

  1. call/ccはcall-with-input-fileとかと同じcall系の関数

その中で、渡すものが継続というタイプの関数である、というだけのこと。

  1. 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」で試しても同じ。

なんで?