这个Scheme列表迭代器如何使用call-with-current-continuation?
我正在尝试阅读此代码:
(define list-iter
(lambda (a-list)
(define iter
(lambda ()
(call-with-current-continuation control-state)))
(define control-state
(lambda (return)
(for-each
(lambda (element)
(set! return (call-with-current-continuation
(lambda (resume-here)
(set! control-state resume-here)
(return element)))))
a-list)
(return 'list-ended)))
iter))
任何人都可以解释call-with-current-continuation
在这个例子中是如何工作的吗?
谢谢
没有找到相关结果
已邀请:
3 个回复
凡夕
的本质,或简称
,是在程序执行期间获取检查点或延续的能力。然后,您可以通过像函数一样应用它们来返回这些检查点。 这是一个不使用延续的简单示例:
如果你不使用延续,很难区分。以下是我们实际使用它的一些内容:
当调用continuation时,控制流会跳回到
抓住延续的位置。把
表达想象成一个洞,它会被传递给
的任何东西填满。
对
的使用要复杂得多,并且可能是开始使用它的一个困难的地方。首先,这是一个示例用法:
这是一个正在发生的事情的草图:
返回无参数的程序
。 当调用
时,我们立即抓住一个延续并将其传递给
。当调用
的延续时,我们将立即返回到调用
的人。 对于列表中的每个元素,我们获取一个新的延续并用新的延续覆盖
的定义,这意味着我们将在下一步第2步出现时从那里继续。 在下次设置
之后,我们将列表的当前元素传递回
延续,产生列表的元素。 当再次调用
时,从步骤2开始重复,直到
完成整个列表的工作。 用
调用
续。由于
未更新,因此每次调用
时它将继续返回
。 正如我所说,这是一个相当复杂的使用
,但我希望这足以通过这个例子。为了更温和地介绍延续,我建议选择The Seasoned Schemer。
呈辖玫割善
作为参数,并将
应用于程序的当前上下文/状态。 来自维基百科:
所以基本上当没有电流延续(cc)调用f时,函数应用于2,然后返回3.当使用current-continuation时,参数应用于2,这会强制程序跳转到调用current-continuation,因此返回2.它可用于生成返回或暂停执行流。 如果您了解C,请考虑如下:在C中,您可以获取指向函数的指针。你也有一个返回机制。假设返回采用了函数所采用的相同类型的参数。假设您可以获取其地址并将该地址存储在变量中或将其作为参数传递,并允许函数返回给您。它可以用来模仿抛出/捕获,或者作为协同程序的机制。
长拳
希望它更容易理解。