所以我相信我现在理解延续,至少在某种程度上,感谢community scheme wiki和Learn Scheme in Fixnum Days。
但是我想要更多的练习 - 也就是说,我可以通过更多的示例代码(最好是做作,所以没有多余的东西可以分散注意力)。
特别是,我想解决更多关于继续恢复和/或协同程序的问题,而不是仅使用它们来退出循环或其他任何东西(这是相当简单的)。 / p>
无论如何,如果你知道除了我上面提到的那些教程之外的好教程,或者如果你想发布一些你写的东西,这将是一个很好的练习,我会非常感激!
答案 0 :(得分:5)
是的,延续可能非常令人费解。这是我在一段时间后发现的一个很好的谜题 - 试着找出打印的内容和原因:
(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)
解释这是如何工作的(包含剧透!):
call/cc
商店会返回它自己的续约,并将其存储在k
。1
将写入屏幕。1
再次写入屏幕2
将写入屏幕1
再次写入屏幕3
将写入屏幕因此,正确的输出为11213
。我在粗体文本中最常见的粘贴点 - 重要的是要注意当你使用continuation'重置'k的值时它不会影响原始延续中的k值。一旦你知道它变得更容易理解。
答案 1 :(得分:4)
布朗大学的编程语言课程公开problem set on continuations。