寻求人为的示例代码:延续!

时间:2009-04-16 21:14:55

标签: scheme continuations coroutine

所以我相信我现在理解延续,至少在某种程度上,感谢community scheme wikiLearn Scheme in Fixnum Days

但是我想要更多的练习 - 也就是说,我可以通过更多的示例代码(最好是做作,所以没有多余的东西可以分散注意力)。

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

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

2 个答案:

答案 0 :(得分: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. 的延续
  6. 数字1再次写入屏幕
  7. 当前的继续,将在B点继续,返回k,这是另一个(但不同)延续到另一个点B
  8. 一旦我们回到最初的延续,重要的是要注意这里k仍然绑定到A
  9. 数字2将写入屏幕
  10. 当前继续,将在C点继续,返回k,返回A
  11. 这一次,k现在必然会受到我们在C
  12. 的延续
  13. 数字1再次写入屏幕
  14. 当前继续(将在B点继续)返回k,返回C
  15. 数字3将写入屏幕
  16. And you're done
  17. 因此,正确的输出为11213。我在粗体文本中最常见的粘贴点 - 重要的是要注意当你使用continuation'重置'k的值时它不会影响原始延续中的k值。一旦你知道它变得更容易理解。

答案 1 :(得分:4)

布朗大学的编程语言课程公开problem set on continuations