我正在尝试了解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))
它应该输出
@*@**@***@****@...
,但我不明白为什么;我希望它能输出
@*@*********
...有人可以详细解释为什么阴阳拼图以其工作方式起作用吗?
最佳答案
我认为我对此并不完全理解,但是我只能想到一种解释(极度挥手):
yin
和yang
首次绑定(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/