所以我相信我现在至少在某种程度上理解了延续,这要归功于社区计划 wiki和Fixnum Days 中的 Learn Scheme。
但是我想要更多的练习——也就是说,我可以在脑海中完成更多的示例代码(最好是人为的,所以没有多余的东西可以分散这个概念的注意力)。
具体来说,我想解决更多关于恢复和/或协同程序的问题,而不是仅仅使用它们来退出循环或其他任何东西(这相当简单)。
无论如何,如果你知道除了我上面链接的那些之外的好教程,或者如果你想发布你写的东西,这将是一个很好的练习,我将非常感激!
所以我相信我现在至少在某种程度上理解了延续,这要归功于社区计划 wiki和Fixnum Days 中的 Learn Scheme。
但是我想要更多的练习——也就是说,我可以在脑海中完成更多的示例代码(最好是人为的,所以没有多余的东西可以分散这个概念的注意力)。
具体来说,我想解决更多关于恢复和/或协同程序的问题,而不是仅仅使用它们来退出循环或其他任何东西(这相当简单)。
无论如何,如果你知道除了我上面链接的那些之外的好教程,或者如果你想发布你写的东西,这将是一个很好的练习,我将非常感激!
是的,延续可能非常令人费解。这是我不久前发现的一个很好的谜题 - 尝试找出打印的内容以及原因:
(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
。我用粗体表示的最常见的症结点 - 重要的是要注意,当您使用延续来“重置” k 的值时,它不会影响原始延续中的 k 值。一旦你知道它变得更容易理解。
布朗大学的编程语言课程在公开的延续上存在问题。