【问题标题】:Seeking contrived example code: continuations!寻求人为的示例代码:延续!
【发布时间】:2010-10-19 23:24:17
【问题描述】:

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

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

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

无论如何,如果您知道除了我上面链接的教程之外的其他好教程,或者如果您愿意发布您编写的一些很好的练习,我将非常感激!

【问题讨论】:

    标签: scheme continuations coroutine


    【解决方案1】:

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

    (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. And you're done

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

    【讨论】:

    • 嗯,是的,这正在摧毁我的大脑。 csi 说结果是 11213,但我只能理解 '112' ......我一定是错过了什么!
    • 谢谢,粗体部分正是我感到困惑的地方。让我再试一次... :)
    • 再次感谢。这个练习很有帮助。我不是一个聪明人,所以我需要尽可能多的东西!
    • 别自责——我也花了一段时间才明白。绊脚石甚至不是由延续引起的,而是由 Scheme 中的变量绑定方式引起的。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-02-26
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多