scheme - 阴阳拼图是如何工作的?

标签 scheme callcc

我正在尝试了解Scheme中call / cc的语义,并且续篇的Wikipedia页面以阴阳拼图为例:

(let* ((yin
         ((lambda (cc) (display #\@) cc) (call-with-current-continuation (lambda (c) c))))
       (yang
         ((lambda (cc) (display #\*) cc) (call-with-current-continuation (lambda (c) c)))) )
    (yin yang))

它应该输出@*@**@***@****@...
但我不明白为什么;我希望它能输出@*@********* ...

有人可以详细解释为什么阴阳拼图以其工作方式起作用吗?

最佳答案

我认为我对此并不完全理解,但是我只能想到一种解释(极度挥手):

  • yinyang首次绑定(bind)在let*中时,将打印第一个@和*。应用(yin yang),并在第一次调用/ cc完成后立即返回顶部。
  • 打印下一个@和*,然后打印另一个*,因为这次,yin重新绑定(bind)到第二个 call / cc的值。
  • (yin yang)再次应用,但是这次在原始yang的环境中执行,其中yin绑定(bind)到第一个调用/ cc,因此控制权返回到打印另一个@。 yang参数包含在第二遍中重新捕获的延续,如我们已经看到的,它将导致打印**。因此,在第三次通过时,将打印@*,然后调用此双星打印连续体,因此它以3星结束,然后重新捕获此三星连续体,...
  • 关于scheme - 阴阳拼图是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2694679/

    相关文章:

    方案:重载内置程序,一般重载

    lisp - 来自 "Realm of Racket"的奇怪代码示例

    scheme - `values` 在 Scheme 中是如何工作的?

    lisp - 有人在商业上使用 Racket 吗?

    scheme - 在 Racket/Scheme 中使用 local

    foreach - for-each 中的方案延续

    javascript - call/CC 关闭

    scheme - 使用 call/cc 进行循环。让我们开始吧

    javascript - CallCC 是 goto 的改进版本吗?

    scheme - 什么输入会导致这个函数不终止?