了解计划中的电话/ cc

时间:2015-02-21 11:11:04

标签: scheme racket continuations

有人可以解释一旦为此调用延续会发生什么。

    ((cdr (or (call/cc (lambda (cc) (cons 2 (lambda () (cc #f))))) (cons 3 5))))

    ((cdr (or (call/cc (lambda (cc) (cons 2 (lambda () (cc #f))))) (cons 3 (lambda() (+ 3 2)))))) 

第一个语句给出错误但第二个语句返回5.我的问题是为什么call / cc搜索类似第二个语句的过程而不直接输出5。

1 个答案:

答案 0 :(得分:1)

((cdr X))中,如果X不评估为cdr为thunk的对,则会出现错误。

在第一个表达式中,X的初始值为(cons 2 (lambda () (cc #f)))。一切都很好。但是,当您调用thunk时,表达式(cc #f)将返回#f到或,因此(or #f (cons 3 5))将评估为cdr中的5对。我们现在有((cdr (cons 3 5)))的情况,它将尝试应用5。

简而言之:(cc #f)会将值返回到出现(call / cc _)的上下文。将#f返回到该上下文意味着or-expression将返回该对(cons 3 5),因此((cdr X))将失败。