call/ccで全く同じ状況が繰り返されるわけではない

「call/ccはゲームのセーブ/ロードみたいなもの」という説明で「call/ccが呼ばれた時点でのインタプリタの全状態が保存される」「全く同じ状況が再現される」的な理解をしている人がいたので違うよというコードを書いた。あくまで保存されるのは現在のスコープだけであって、外のスコープを書き換えたらそれの影響は受ける。

gosh> (define x 1)
x
gosh> (define c 0)
c
gosh> (define (foo) (call/cc (lambda (c_) (set! c c_))) x)
foo
gosh> (foo)
1
gosh> c
#<subr continuation>
gosh> (c)
1
gosh> (set! x 2)
2
gosh> (c)
2

西尾泰和(nishio.hirokazu) 14:40
ゲームデータのセーブでアイテムはセーブされるけど、FPSやコントローラの設定は別スコープ、みたいな。

西尾泰和(nishio.hirokazu)14:41
グローバル変数いくない!ってことじゃないのw
引数で渡せばいいわけでw