【问题标题】: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)) 将失败。

    【讨论】:

      猜你喜欢
      • 2012-02-21
      • 2011-03-03
      • 2016-06-07
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多