寻求人为的示例代码:继续!
-
09-09-2019 - |
解决方案
是的,继续下去可能会非常令人费解。这是我不久前发现的一个很好的谜题 - 尝试找出打印的内容以及原因:
(define (mondo-bizarro)
(let ((k (call/cc (lambda (c) c)))) ; A
(write 1)
(call/cc (lambda (c) (k c))) ; B
(write 2)
(call/cc (lambda (c) (k c))) ; C
(write 3)))
(mondo-bizarro)
其工作原理说明(包含剧透!):
- 首先
call/cc
商店返回它自己的延续并将其存储在k
. - 号码
1
被写入屏幕。 - 当前的继续,即在 B 点继续,返回到 k,k 返回到 A
- 这次,k 现在绑定到我们在 B 处获得的延续
- 号码
1
再次写入屏幕 - 将在 B 点继续的当前延续返回到 k,这是到另一个 B 点的另一个(但不同)延续
- 一旦我们回到原来的延续,请务必注意这里 k 仍然绑定到 A
- 号码
2
被写入屏幕 - 当前的继续,即在 C 点继续,返回到 k,k 返回到 A
- 这次,k 现在绑定到我们在 C 处获得的延续
- 号码
1
再次写入屏幕 - 当前的继续,即在 B 点继续,返回到 k,k 返回到 C
- 号码
3
被写入屏幕 - 你就完成了
因此,正确的输出是 11213
. 。我用粗体文本表示的最常见的症结是 - 重要的是要注意,当您使用延续来“重置” k 的值时,它不会影响原始延续中的 k 值。一旦你知道了,它就会变得更容易理解。
其他提示
布朗大学的编程语言课程有一个问题上延续设置公众可获得的。
不隶属于 StackOverflow