Scheme continuation 学习之 tree->generator

发布于 2022-09-08 06:16:27 字数 2324 浏览 14 评论 0

最近在学习 scheme 中的 continuation,终于把 tree-generator(Teach Yourself Scheme in Fixnum Days) 看懂了,
根据自己的理解又写了一个改良版本,比较容易理解。

  1. ;;;    Function: tree->generator
  2. ;;;    Example:
  3. ;;;    > (define t '(1 (2) 3))
  4. ;;;    > (define gen (tree->generator t))
  5. ;;;    > (gen)
  6. ;;;    1
  7. ;;;    > (gen)
  8. ;;;    2
  9. ;;;    > (gen)
  10. ;;;    3
  11. ;;;    > (gen)
  12. ;;;    '()
  13. ;;;    > (gen)
  14. ;;;    '()
  15. (define (tree->generator tree)
  16.   (let ((leaf #f) (walk-tree #f))
  17.     (define (walk-tree)
  18.       (let loop ((tree tree))
  19.         (cond ((null? tree) 'skip)
  20.               ((pair? tree) (loop (car tree))
  21.                             (loop (cdr tree)))
  22.               (else (call/cc
  23.                      (lambda (rest-of-tree)
  24.                        (set! walk-tree
  25.                              (lambda ()
  26.                                (rest-of-tree 'resume)))
  27.                        (leaf tree))))))
  28.       (leaf '()))
  29.     (define (next)
  30.       (call/cc
  31.        (lambda (k)
  32.          (set! leaf k)
  33.          (walk-tree))))
  34.     next))

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文