代码之家  ›  专栏  ›  技术社区  ›  J Cooper

寻找人为的示例代码:continuations!

  •  5
  • J Cooper  · 技术社区  · 17 年前

    community scheme wiki Learn Scheme in Fixnum Days .

    但我希望有更多的实践——也就是说,我可以在头脑中处理更多的示例代码(最好是人为的,这样就不会有多余的东西干扰这个概念)。

    明确地

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

    2 回复  |  直到 14 年前
        1
  •  5
  •   Kyle Cronin    17 年前

    是的,连续剧可能会让人心烦意乱。这是我不久前发现的一个很好的谜题-试着找出打印的内容以及原因:

    (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 stores返回它自己的延续并将其存储在 k .
    2. 1 被写入屏幕。
    3. 将在点B继续的当前延续返回到k,k返回到A
    4. 1. 再次写入屏幕
    5. 将在点B继续的当前延续返回到k,这是到另一点B的另一个(但不同)延续
    6. 一旦我们回到原来的延续,重要的是要注意,这里k仍然绑定到A
    7. 号码 2 被写入屏幕
    8. 将在点C继续的当前延续返回到k,k返回到A
    9. 这一次,k现在是C的延拓
    10. 号码 再次写入屏幕
    11. 号码 3 被写入屏幕
    12. And you're done

    因此,正确的输出是 11213 . 我在粗体文本中指出的最常见的症结——需要注意的是,当使用continuations“重置”k值时,它不会影响原始continuation中k的值。一旦你知道它变得更容易理解。

        2
  •  4
  •   RossFabricant    17 年前

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

    推荐文章