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

J C*_*per 5 scheme continuations coroutine

所以我相信我现在理解延续,至少在某种程度上,这要归功于Fixnum Days中社区方案wikiLearn Scheme.

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

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

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

Kyl*_*nin 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)
Run Code Online (Sandbox Code Playgroud)

解释这是如何工作的(包含剧透!):

  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.我在粗体文本中最常见的粘贴点 - 重要的是要注意当你使用continuation'重置'k的值时它不会影响原始延续中k的值.一旦你知道它变得更容易理解.