计划延续:在顶级和非顶级级别呼叫'call / cc'之间有什么区别?

时间:2014-08-16 12:03:34

标签: scheme racket

此代码按预期工作:

(define saved #f)
(cons 'wo (call/cc (lambda (k) (set! saved k) '())))
(saved 'ca!)

输出(球拍控制台):

'(wo)
'(wo . ca!)

但是当我将它包装在函数中并调用它时,程序永远不会停止。为什么呢?

(define (test)
    (define saved #f)
    (cons 'wo (call/cc (lambda (k) (set! saved k) '())))
    (saved 'ca!))

(test)

1 个答案:

答案 0 :(得分:4)

继续是在保存的执行环境中完成的所有工作。

在第一种情况下,在致电cons时会保存续集,因此只是为了减少某些事情并返回到REPL。

在第二种情况下,您调用过程test,因此延续两者

  1. 缺点
  2. 使用' ca!
  3. 调用绑定到saved的程序(即继续)

    所以继续调用自身,因此循环。