有人可以解释一旦为此调用延续会发生什么。
((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。
答案 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))将失败。