所以我相信我现在至少在某种程度上理解了延续性,这要归功于 社区计划维基固定天学习计划.

但我想要更多的练习——也就是说,我可以在脑海中完成更多的示例代码(最好是人为的,这样就没有无关的东西来分散对这个概念的注意力)。

具体来说, ,我想通过恢复和/或协程来解决更多问题,而不是仅仅使用它们来退出循环或其他什么(这相当简单)。

不管怎样,如果你知道除了我上面链接的教程之外的好教程,或者如果你愿意发布你写的一些东西,这将是一个很好的练习,我将非常感激!

有帮助吗?

解决方案

是的,继续下去可能会非常令人费解。这是我不久前发现的一个很好的谜题 - 尝试找出打印的内容以及原因:

(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)

其工作原理说明(包含剧透!):

  1. 首先 call/cc 商店返回它自己的延续并将其存储在 k.
  2. 号码 1 被写入屏幕。
  3. 当前的继续,即在 B 点继续,返回到 k,k 返回到 A
  4. 这次,k 现在绑定到我们在 B 处获得的延续
  5. 号码 1 再次写入屏幕
  6. 将在 B 点继续的当前延续返回到 k,这是到另一个 B 点的另一个(但不同)延续
  7. 一旦我们回到原来的延续,请务必注意这里 k 仍然绑定到 A
  8. 号码 2 被写入屏幕
  9. 当前的继续,即在 C 点继续,返回到 k,k 返回到 A
  10. 这次,k 现在绑定到我们在 C 处获得的延续
  11. 号码 1 再次写入屏幕
  12. 当前的继续,即在 B 点继续,返回到 k,k 返回到 C
  13. 号码 3 被写入屏幕
  14. 你就完成了

因此,正确的输出是 11213. 。我用粗体文本表示的最常见的症结是 - 重要的是要注意,当您使用延续来“重置” k 的值时,它不会影响原始延续中的 k 值。一旦你知道了,它就会变得更容易理解。

其他提示

布朗大学的编程语言课程有一个问题上延续设置公众可获得的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top