在Kent Dybvig(第四版)The Scheme Programming Language的section 3.4中,他非常清楚地描述了延续传递风格是什么。由于这个原因,他给出了两个原因:
由于第一个原因也可以使用
values
过程完成,第二个原因可以使用case-lambda
完成,因此我不清楚使用延续传递样式的优势。有人可以向我展示一些示例,这些示例适用于哪些地方应该使用延续传递样式,哪些地方可以使代码更好,更清晰等?
最佳答案
Dybvig使用本节中的显式延续来激发将call/cc
作为语言的一部分。要点在本节末尾提到,他提到如果不编写代码就需要对所使用的所有代码(包括您调用的函数)进行全局转换。因此,在Scheme中,您通常使用宏来构建自己的构造,而延续是这些有用的构造之一-但您不能通过宏来实现它们,因为它们仅实现局部转换。
但是直接使用CPS样式仍然很有用:例如,正如他提到的那样,您可以编写一个具有多个延续的函数,可能具有不同的误差-例如解析函数,该函数接收单输入函数以发送解析失败时,将值解析为,并调用null失败函数(该函数可能会因错误或回溯而中止,并尝试使用其他解析规则)。另一个可能的用法是,当您想精确控制继续执行的内容时,而不是让call/cc
捕获整个上下文。
还有一种明显的情况是,使用没有一流延续性的语言编写代码,这使CPSed代码成为您的唯一选择。一个例子就是很多使用IO的node.js程序,这迫使您用显式的CPS编写代码。
关于scheme - 为什么延续过去的风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8544127/