了解方案中的 call/cc

understanding call/cc in scheme

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

    ((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)))))) 

第一个语句出错,第二个语句出错 returns 5. 我的问题是为什么 call/cc 搜索像第二个语句这样的过程而不是直接输出 5。

((cdr X)) 中,如果 X 的计算结果不是 cdr 是 thunk 的一对,您将得到一个错误。

在您的第一个表达式中,X 的初始值为 (cons 2 (lambda () (cc #f)))。所以一切都很好。但是,当您调用 thunk 时,表达式 (cc #f) 将 return #f 转换为 or,因此 (or #f (cons 3 5)) 将计算为 cdr 中带有 5 的一对。我们现在的情况 ((cdr (cons 3 5))) 将尝试应用 5.

简而言之:(cc #f) 将 return 值添加到 (call/cc _) 出现的上下文中。这里 returning #f 到该上下文意味着 or 表达式将 return 对 (cons 3 5) 因此 ((cdr X)) 将失败。