5

所以我相信我现在至少在某种程度上理解了延续,这要归功于社区计划 wikiFixnum Days 中的 Learn Scheme

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

具体来说,我想解决更多关于恢复和/或协同程序的问题,而不是仅仅使用它们来退出循环或其他任何东西(这相当简单)。

无论如何,如果你知道除了我上面链接的那些之外的好教程,或者如果你想发布你写的东西,这将是一个很好的练习,我将非常感激!

4

2 回答 2

5

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

(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,返回到A
  4. 这一次,k 现在绑定到我们在 B 处得到的延续
  5. 数字1再次写入屏幕
  6. 当前的延续,即在 B 点继续,返回到 k,这是到另一个 B 点的另一个(但不同的)延续
  7. 一旦我们回到原来的延续,重要的是要注意这里的 k 仍然绑定到 A
  8. 数字2写入屏幕
  9. 当前的延续,就是在C点继续,返回到k,返回到A
  10. 这一次,k 现在绑定到我们在 C 处得到的延续
  11. 数字1再次写入屏幕
  12. 当前的继续,即在B点继续,返回到k,又返回到C
  13. 数字3写入屏幕
  14. 你完成了

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

于 2009-04-16T21:20:00.767 回答
4

布朗大学的编程语言课程在公开的延续上存在问题。

于 2009-04-16T21:30:35.140 回答