scheme - 为什么延续过去的风格

标签 scheme continuations continuation-passing

在Kent Dybvig(第四版)The Scheme Programming Languagesection 3.4中,他非常清楚地描述了延续传递风格是什么。由于这个原因,他给出了两个原因:

  • 将多个结果传递给其延续,因为实现延续的过程可以采用任意数量的参数。
  • CPS还允许过程采用单独的延续...,该延续可以接受不同数量的参数。

  • 由于第一个原因也可以使用values过程完成,第二个原因可以使用case-lambda完成,因此我不清楚使用延续传递样式的优势。有人可以向我展示一些示例,这些示例适用于哪些地方应该使用延续传递样式,哪些地方可以使代码更好,更清晰等?

    最佳答案

    Dybvig使用本节中的显式延续来激发将call/cc作为语言的一部分。要点在本节末尾提到,他提到如果不编写代码就需要对所使用的所有代码(包括您调用的函数)进行全局转换。因此,在Scheme中,您通常使用宏来构建自己的构造,而延续是这些有用的构造之一-但您不能通过宏来实现它们,因为它们仅实现局部转换。

    但是直接使用CPS样式仍然很有用:例如,正如他提到的那样,您可以编写一个具有多个延续的函数,可能具有不同的误差-例如解析函数,该函数接收单输入函数以发送解析失败时,将值解析为,并调用null失败函数(该函数可能会因错误或回溯而中止,并尝试使用其他解析规则)。另一个可能的用法是,当您想精确控制继续执行的内容时,而不是让call/cc捕获整个上下文。

    还有一种明显的情况是,使用没有一流延续性的语言编写代码,这使CPSed代码成为您的唯一选择。一个例子就是很多使用IO的node.js程序,这迫使您用显式的CPS编写代码。

    关于scheme - 为什么延续过去的风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8544127/

    相关文章:

    scheme - 为什么我不能在 DrRacket 中使用方括号作为方案?

    scala - 在while循环中使用Scala延续

    types - 阴阳延续拼图在打字语言中有意义吗?

    c# - 为什么会调用 OnlyOnCanceled 延续?

    monads - 在 Coq 中证明延续传递式 Monad

    scala - 嵌套 CPS "reset"

    scheme - 列表长度比较

    list - 方案列表等价比较

    clojure - 当一个负值传递给这个 abs 函数时,Clojure 如何产生一个正值?

    scala - Scala 中的延续传递风格