【发布时间】:2022-06-11 03:41:20
【问题描述】:
R5rs 说
延续代表计算的整个(默认)未来”。
所以基本上在下面的代码中:
(define x (call/cc (lambda (c) c)))
(display "hello\n")
(display "world\n")
(x 4)
(display x)
我尝试了几个实现,都输出了
hello
world
4
在这个例子中,call/cc 捕获的延续似乎只限制了第一个顶级表达式的范围。喜欢(define x ?)。
我虽然基于r5rs,但是当(x 4)被执行时,执行会跳回到开始的定义形式,完成赋值。然后它将继续运行随后的两个显示表达式并运行(x 4),这将报告错误,因为 x 将不再是一个过程。
【问题讨论】:
-
如果你捕获了栈上最外层表达式和定义的序列,这意味着每个捕获的延续都会在你恢复它的那一刻重新启动程序,你不希望这样。无论如何,运行方案的最顶层没有空堆栈,而是包含关闭延续的堆栈。我认为你应该继续使用方案,如果你觉得你的问题有些“棘手”,你应该继续使用,你会单独澄清这类问题。
-
我相信那句话后面有一个隐含的“捕获它的表达式”。
标签: scheme continuations