【问题标题】:understanding call/cc in scheme了解方案中的呼叫/抄送
【发布时间】:2015-04-23 01:57:50
【问题描述】:
有人可以解释一下,一旦为此要求继续,会发生什么。
((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。
【问题讨论】:
标签:
scheme
racket
continuations
【解决方案1】:
在((cdr X)) 中,如果 X 未计算为 cdr 为 thunk 的对,则会出现错误。
在您的第一个表达式中,X 的初始值为(cons 2 (lambda () (cc #f)))。所以一切都很好。但是,当您调用 thunk 时,表达式 (cc #f) 将返回 #f 到 or,因此 (or #f (cons 3 5)) 将评估为 cdr 中带有 5 的对。我们现在有((cdr (cons 3 5))) 的情况,它将尝试申请 5。
简而言之: (cc #f) 将返回一个值到 (call/cc _) 出现的上下文中。这里将 #f 返回到该上下文意味着 or 表达式将返回 (cons 3 5) 对,因此 ((cdr X)) 将失败。