【发布时间】:2020-04-02 03:26:26
【问题描述】:
我的背景是 Javascript、Python 和一点 Haskell。嗨,我是 Scheme 的新手(1 天大)。我想了解以下 2 个代码 sn-ps 之间的区别。
(define onePlus (lambda (v) (+ 1 v)))
(onePlus 4) ; 5
使用 CallCC
(define anotherOnePlus 0)
(+ 1 (call/cc (lambda (k) (set! anotherOnePlus k) (k 4)))) ; 5
(anotherOnePlus 4); 5
为什么有人想通过第二种方式来掌握你所居住的功能。从更大的角度来看,我错过了什么?
Scope获取函数有什么限制吗?
(define temp 0)
(+ 1 (+ 2 (+ 3 (call/cc (lambda (k) (set! temp k) (k 4)))))) ; 10
(temp 5) ; 11
这里绝对看起来像 JS 中的 h => 1 + 2 + 3 + h。
如果我想获取(+ 3 h),这意味着我需要将它写在单独的行中怎么办?
【问题讨论】:
-
如果这是你使用 Scheme 的第一天,你不应该从延续 :) 开始。它们不是范围规则的“限制”。将它们视为更好地控制执行堆栈的一种方式,但您很少需要在日常工作中使用它们。
-
Haskell 只有 delimited 延续。 Scheme 的 undelimited 延续可以保存并重新输入 any 上下文。调用从
.... (call/cc (lambda (k) ....)) ....获取的(k val)会将val返回到等待该(call/cc (lambda (k) ....))表单返回值的上下文中。我知道的唯一模拟是 C 的longjmp。 TSPL 有更多。还有其他关于 Scheme 的书籍。 -
感谢@WillNess 将 Haskell 与 Scheme 区分开来,在 Haskell 中比较 Scheme 和 callCC 时我感到很困惑。我发现这个链接很有帮助blogs.msdn.microsoft.com/ashleyf/2010/02/11/…
-
请注意,尽管 CPS 中的“延续”不是 Scheme 的完整的、“真实的”无定界延续。 CPS 中的“延续”是函数,但 undelimited continuations are not functions.