【问题标题】:Why isn't REPL-style development more common in Ruby?为什么 REPL 风格的开发在 Ruby 中不常见?
【发布时间】:2026-01-07 05:35:02
【问题描述】:

看起来 Lisp 和 Clojure 程序员经常直接在 REPL 中开发程序。参看。 Clojure Development: IDE or REPL?

我的问题是,为什么这种方法在 Ruby 中不是更常见,通过irb?这只是一种文化差异,还是有结构(特定于语言)的原因,为什么 Lisps 比 Ruby 和 Python 等语言更常见以 REPL 为中心的开发?

【问题讨论】:

    标签: ruby clojure lisp read-eval-print-loop


    【解决方案1】:

    Lisp 语法似乎非常适合组合 REPL 和源文件的方法。当每个表单的文本限制明确时,以编程方式移动代码 sn-ps 会容易得多。

    【讨论】:

      【解决方案2】:

      我将 Emacs 用于 Clojure 和 Ruby,并且经常将我的 ruby​​ 模块加载到 irb 中并在 emacs 中以与执行 REPL 相同的方式进行交互。

      【讨论】:

      • 这很简洁,但它没有回答问题。他没有声称或假设这是不可能的(事实上,恰恰相反)。他问为什么它没有更受欢迎。
      • 也许他们不使用 emacs,或者在测试驱动开发方面比我好得多。
      【解决方案3】:

      我认为这在很大程度上要归功于 Rubyists 倾向于使用的编辑器。我使用 vim,它没有与 REPL 交互的好方法。 Textmate 在同一条船上(AFAIK)。另一方面,Emacs、Dr Racket 等都具有与 REPL 交互的绝妙机制。我相信 Lispers 会倾向于使用这些类型的编辑器/环境。

      【讨论】:

      【解决方案4】:

      也许这些会有所帮助:

      • interactive_editor 是一个 IRB 扩展,增加了打开 vim、emacs、MacVim、nano 和 TextMate 以及编辑 irb 缓冲区的能力。
      • irbtools 包括 interactive_editor 以及其他一些不错的附加功能。
      • Utility Belt 是 IRB gems 的另一个集合,扩展了它的功能,还包括一些允许编辑缓冲区的东西。

      我是老派,所以我通常会打开一个编辑器并在终端窗口中运行 irb;你知道,旧习惯很难改掉。我确实使用了 irbtools,但打算切换到 Utility Belt,看看比较起来感觉如何。

      【讨论】:

        【解决方案5】:

        其实这我开发Ruby的方式。

        通常我写我的代码,然后我将它的一部分粘贴到 irb,调整它们,再次粘贴它们等等。

        在 Lisps 中没有办法打印出您在程序中开发的 REPL 样式的“当前状态”吗?我认为这在 ruby​​ 中是不可能的。

        【讨论】:

          【解决方案6】:

          与通过 Ruby 的 REPL 等效项输入内容相比,运行单元测试通常更省力。话又说回来,有时我必须在代码中添加一些 printf 调试...

          【讨论】:

          • 我认为这是一种文化。 Ruby 具有快速启动、完成后退出的 unix 传统,而 lisp 文化更多的是关于生活环境。但没有技术原因不能以这种方式使用 Ruby。
          【解决方案7】:

          我不是 Ruby 开发人员。但是我觉得原因是参考透明度。

          大多数惯用的 Clojure 函数都是遵循引用透明性的纯函数。因此,我个人发现测试独立的独立单元的功能要容易得多,并且它们在某种程度上提供了单元测试的目的。 Clojure 是一种高度自以为是的语言,它更喜欢大多数函数是无状态的。它明确区分了发生副作用的代码以及使用各种其他替代方法(如varrefsagentsatoms 等)维护状态的代码,保持大部分代码干净、无副作用并且引用透明。

          我觉得任何围绕引用透明和无状态函数构建的代码都会自动受益于 REPL,无论它是使用 Ruby 还是任何其他编程语言。

          尽管出于大多数实际目的,其他语言提供的 CLI 也同样有用,但是 Read, Eval, Print and Loop 的概念在 LISP 中与在任何其他语言中的概念不同。任何non-homoiconic 语言都没有READ 阶段,它只是读取文本表示或字符串,但是在LISP 中,READ 阶段实际上能够以任何形式的s-expression 进行解析它。有关它的更多详细信息,请参阅以下 2 个答案:

          Is Lisp the only language with REPL?

          How is Lisp's read-eval-print loop different than Python's?

          【讨论】: