6

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

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

4

8 回答 8

8

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

于 2011-02-02T23:47:27.803 回答
2

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

于 2011-02-02T21:21:17.863 回答
1

也许这些会有所帮助:

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

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

于 2011-02-03T03:11:30.220 回答
1

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

于 2011-02-02T23:32:09.827 回答
1

实际上,这就是我开发 Ruby 的方式。

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

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

于 2011-02-02T21:30:15.413 回答
0

通常,运行单元测试比通过 Ruby 的 REPL 输入内容要省力。再说一次,有时我必须在代码中添加一些 printf 调试...

于 2011-02-02T22:00:38.470 回答
0

我使用 Ruby 已经 17 年了,并且总是使用 REPL 来帮助我完成所有事情,通过使用纯 IRB 或使用 Rails 控制台进行 Rails 应用程序,我通常在我想要调查/调试的事情中间打开 IRB 会话所以在很多情况下,实际上 IRB 通常是我的主要调试器。

可以肯定的是,我在 Ruby 中使用 REPL 的工作不会回忆起在 LISP 中的整个体验,我可能会在 Ruby 中打开和关闭解释器数百倍,而不是在 CL 或 Scheme 中它会保持打开更长时间(我也是直接从终端使用它,而不是在 emacs 中使用它,但由于我的工作环境方便,这是个人选择)。

由于 Ruby 非常强大且可以灵活地检查自身,因此在我不记得方法名称但我记得其中一部分的情况下使用 IRB 是非常常见的……我只是问对象直接获取其方法列表,并使用枚举器方法过滤数组以“选择/检测”我想要的方法,然后调用正确的方法,检查结果等(my_object.methods.select{|m| m =~ /that_part_of_the_name_i_remember/ }.sort)。

任何你需要 IRB 会话的地方,你都可以调用binding.irb,所以如果你想在正在运行的测试中或在你的 web 服务器上的请求处理期间打开它实际上并不重要,你总是可以很容易地打开它并学习你需要的任何东西关于你的物品,我一直这样做。

并且由于 Ruby 以与 CL 中相同的方式具有开放类和开放对象,因此您可以在 IRB 会话中一次又一次地重写方法,直到达到您可能想要的结果,唯一需要注意的是您需要复制并将这个新版本“手动”粘贴到适当的位置(但实际上使用 Ruby 更容易做到这一点,因为您可以通过简单地调用类似my_obj.method(:that_specific_method).source_locationwhich works 的东西(包括来自 Gems/libraries的方法)来询问 Ruby 究竟在哪里定义了一个方法。更多比起我引以为豪的事情,我只是打电话给自己`emacs #{my_obj.method(:that_specific_method).source_location.join(":")}`

这不仅是一种个人风格,而且解释器对于社区来说也非常重要,以至于实际上开发人员付出了很多努力才能拥有一个强大、始终可用且易于使用的工具。IRB 因为总是带有 lib readline 并且最近它收到了一个更强大的编辑器,但是在其中编辑东西总是比在 CL 或 Scheme REPLS 中容易得多(因为我在学习 LISP 之前学习了 Ruby 几年,当我第一次开始使用 CL 和 Scheme 时REPLs 直接我一直觉得它们实际上很可怕,我花了很多时间才习惯了解释器不是以相同方式使用的想法,并习惯了 Slime 和 Geiser;打开 SBCL在命令行中并且默认情况下至少没有基本的 readline 包装 - 感谢 rlwrap !!! - 一开始很奇怪,

(我无法表达在一个 LISP REPL 中开始输入我选择不使用的行是多么令人沮丧,输入 Ctrl-C 而不仅仅是“取消”我的行它为我提供了一个重新启动选项,因为我做了出了点问题。我知道所有 LISP 开发人员都是上帝,他们永远不会输入他们不想要的行,但由于我不是其中之一,我通常想重新启动该行,即使在 emacs+Slime 上,这也需要更多的努力不仅仅是“Ctrl-cing”这条线)

我不是在谈论那些要比较并说 IRB 比这个或那个 REPL 更好的东西,而是要表明这是 Ruby 开发人员生活的重要组成部分,因为 CL 或 Scheme REPL 在 lispers 的生活中,除了可能将它嵌入到您选择的 emacs 或文本编辑器中的部分(有些人这样做,有些人不这样做),但它的内置编辑器变得如此强大,以至于今天它会在您进入时自动缩进代码块,默认情况下它具有语法突出显示,它使用 TAB 自动完成方法的名称,但是如果您已经输入了方法的完整名称并再次到达 TAB,它将向您显示该方法的文档,您可以通过简单的输入“q”来关闭...这种集成使得它使用起来非常简单,以至于我很少将它与我使用 Slime 的东西进行比较,但它一直对我有帮助,它推动了我学习新工具、新库的大量探索性工作,通过到处的小实验来创建我的代码等等。这与编写测试的习惯一起经常推动我的工作方式,我以疯狂的方式混合测试和 IRB 会话,包括从测试中打开 IRB 以检查事物,关闭当我达到我认为没问题的地步时,他们再次运行测试并更改代码,然后继续。我以疯狂的方式混合测试和 IRB 会话,包括从测试中打开 IRB 以检查事物,当我达到我认为可以的点时关闭它们,再次运行测试并更改代码,然后继续。我以疯狂的方式混合测试和 IRB 会话,包括从测试中打开 IRB 以检查事物,当我达到我认为可以的点时关闭它们,再次运行测试并更改代码,然后继续。

我觉得唯一超出我的经验的是使用 Smalltalk 和 Pharo,编码、检查和实验之间的障碍比这要低。

(Obs.:我知道有人用 Slime 和 Ruby 创建了一个 Swank,但我一直无法让它正常工作......但这也许意味着有人拥有世界上最好的,对吧?)

于 2022-02-04T07:08:05.630 回答
-1

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

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

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

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

Lisp 是唯一带有 REPL 的语言吗?

Lisp 的 read-eval-print 循环与 Python 的有何不同?

于 2016-08-22T20:54:35.657 回答