call/ccを勉強ちゅ。

こことか
http://www.shido.info/lisp/callcc.html

ココなんかを見ながら勉強中です
http://www.geocities.jp/m_hiroi/clisp/clispb14.html


でも、こんなコードがあった時、
㏄ に何が入るのかわからない。><;

(define *save* '())
(define fact
  (lambda (x)
    (if (= x 1)
        (call/cc
         (lambda (cc)
           (set! *save* cc)
           1))
      (* x (fact (- x 1))))))

スタックに積まれた lambda式 を
順番に見ていくとそれっぽい感じなので
スタックを上がるときに ㏄ に cons すればいいのかな?

(fact 3)

(* 3 (fact (- 3 1)))
(* 3 (* 2 (fact (- 2 1))

; ここでcall/cc
; lambda の 最後の1が 評価された値になる
(call/cc (lambda (cc) (set! *save* cc) 1) ⇒ 1

(* 3 (* 2 (1))
(* 3 (2))
(6)


;(cons 1 cc)
;(cons (* 2) cc)
;(cons (* 3) cc)


;ここでcall/cc の本体が呼ばれる、、、のかな?
:((lambda (cc) (set! *save* cc)) '(* 3 (* 2 (1)))

もうだめだーねるー