了解方案中的 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)) 将失败。
有人可以解释一下为此调用延续后会发生什么吗。
((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)) 将失败。