ruby - 头等舱延续的缺点

标签 ruby functional-programming scheme continuations

针对将延续作为一流对象公开的批评有哪些?

我觉得有头等舱的延续很好。它允许完全控制指令的执行流程。高级程序员可以针对某些类型的问题开发直观的解决方案。例如,延续用于管理 Web 服务器上的状态。语言实现可以在延续之上提供有用的抽象。例如,绿色线程。

尽管如此,是否有强烈反对头等舱延续的论据?

最佳答案

现实情况是,许多可以使用延续的有用情况已经被专门的语言结构所涵盖:throw/catch、return、C#/Python yield。因此,语言实现者并没有太多动力以可用于推出自己的解决方案的通用形式提供它们。

在某些语言中,广义延续很难有效地实现。基于堆栈的语言(即大多数语言)基本上每次创建延续时都必须复制整个堆栈。

那些语言可以实现某些类似延续的特性,那些不破坏基于堆栈的基本模型的语言,比一般情况要高效得多,但实现通用延续要困难得多,也不值得。

由于以下几个原因,函数式语言更有可能实现延续:

  1. 它们经常以连续传递方式实现,这意味着“调用堆栈”可能是分配在堆上的链表。这使得将指向堆栈的指针作为延续传递变得微不足道,因为在弹出当前帧并压入新帧时不需要覆盖堆栈上下文。 (我从未实现过 CPS,但这是我对它的理解。)
  2. 他们支持不可变的数据绑定(bind),这使您的旧延续更有用,因为您不会更改创建它时堆栈指向的变量的内容。

由于这些原因,continuation 很可能主要只存在于函数式语言领域。

关于ruby - 头等舱延续的缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1458364/

相关文章:

ruby-on-rails - 关系的未定义方法 `find_or_initialize'

swift - 如何在 swift 中为 HKT 声明协议(protocol)?

functional-programming - Racket 方案嵌套定义

bash - 使用系统执行某些操作时如何防止代码注入(inject)?

ruby - 为什么 Discourse 运行这么慢?

ruby - watir-webdriver 检查表大小行数和列数

ruby-on-rails - ActiveModel::Serializer belongs_to 属性未显示在 json 响应中

algorithm - 在列表上迭代时在 Scala 中跳出循环

r - 为什么 Map 只需要一组向量作为参数,而 mapply 需要这两个参数和 MoreArgs 参数?

scheme - 如何在方案中创建列表列表?