継続マラソン - 継続の実装方法を考える9

もう少し考えを進めてみよう。

beginの場合

(begin 1 (begin 2 (call/cc ...) 3) 4)


begin(内側)->getContinuation()

(begin _ 3)


begin->parent()->getContinuation()

(begin _ 4)

ifの場合 - 1

(begin 1 (if (call/cc ...) 2 3) 4)


if->getContinuation()

(if _ 2 3)


parentの継続は同じ。

ifの場合 - 2

(begin 1 (if 2 (call/cc ...) 3) 4)


if->getContinuation()

_


parentの継続は同じ。

ifの場合 - 3

(begin 1 (if 2 3 (call/cc ...)) 4)


if->getContinuation()

3


parentの継続は同じ。

define の場合

(begin 1 (define a (call/cc ...)) 2)


define->getContinuation()

(define a _)


define->parent()->getContinuation()

(begin _ 2)

lambda の場合

(begin 1 (lambda () 2 (call/cc ...) 3) 4)

これは lambda が評価されただけなので何も起きない。

lambda 呼び出しの場合

(begin 1 ((lambda () 2 (call/cc ...)) 3) 4)

これは結局 apply(lambda->eval(env)) ということだから手続き呼び出しの場合どうなるかを考えれば良い。

手続き呼び出しの場合

(begin 1 (+ (+ 2 3) (call/cc ...) 4) 5)

(+ の apply)->getContinuation()

(+ 5 _ 4)


いけそうな気がしてきた。