Continuation概念学习历程

2024-04-06

从前一日的学习中,总结出一点:continuation是一个运行时概念,当程序运行起来时,才能捕获到continuation。比如下面代码:
 (define retry #f)
 (define factorial
   (lambda (x)
     (if (= x 0)
         (call/cc (lambda (k) (set! retry k) 1))
         (* x (factorial (- x 1))))))

2024-04-05

2022-09-07
 (call/cc (lambda (current-continuation) ...))
这是call/cc的参数:一个lambda函数,且该lambda接受一个参数,且该参数是current-continuation
 (+ 1 (call/cc (lambda (cc) (cc 2))))
上面这个例子中,(+ 1 █)里去掉黑洞后就是那个call/cc的continuation,很明显,这个continuation其实就是一个函数,它接受一个int型作为参数,也就是这里的黑洞。即这里的continuation=(lambda (█) (+ 1 █))
这个例子的结果:3
要记住:当call/cc里出现cc的调用时,第一个cc函数调用产生的结果就是cc跨越的作用域的代码块的值。
 (* 100
    (+ 1 (call/cc
          (lambda (k)
            (+ 2 9)
            (k 2)
            (k 1)))))
上面这个表达式的值就是第一个cc的调用,即(k 2)就是整个代码块的值,因为k=(lambda (█) (* 100 (+ 1 █))),所以值为300
 (* 100
    (+ 1 (call/cc
          (lambda (k)
            (+ 2 9)))))
上面这个表达式里没有cc的调用,那么在call/cc里没有出现cc的调用时,call/cc调用就是一个普通的函数调用,返回(+ 2 9)=11,然后完成剩余的计算(* 100 (+ 1 11))=1200

2022-08-31

2022-05-23

scheme代码在线运行