一个REPL绑定它们所有?

29
我想知道是否有一种REPL不特定于语言。我花费了很多时间在REPL(主要是Clojure、Scala和Haskell)中来回切换,但它们都或多或少地让我感到沮丧。看起来REPL的工作相当通用,它们应该:

  • 读取:接收用户输入
  • 评估:将输入传递给某些运行时进行处理
  • 打印:将结果打印到屏幕上
  • 循环:等待下一个用户输入

我不明白为什么不应该有一些与语言无关的REPL,但我一直没有找到这样的东西。我理想的REPL应该有以下一些功能:

  • Linux命令行应用程序
  • 通过向上箭头访问无限历史记录
  • 可以编辑以前的命令再次运行
  • ctrl-r用于历史记录搜索就像bash一样
  • 一个REPL中的多个会话,以便我可以轻松切换它们

更加乐观地说,还有:

  • 语法高亮,上下文感知代码完成

这个存在吗?


6
所有的Emacs REPL模式都建立在comint模式之上,因此它们彼此非常相似。自然地,它们支持历史记录和代码补全(在适当的情况下)。 - dfan
2
你在这里有矛盾的要求:你想要一个REPL,同时它又对语言一无所知,但又以某种神奇的方式具有关于语言的亲密知识,以便提供代码完成。 - Jörg W Mittag
3
我认为这些并不矛盾。我想要一个REPL,可以向任意数量的后端呈现统一的接口。语言感知的部分需要是可插拔的,这就是全部。 - Matthew Gilliard
3个回答

34

Bash对 C-r 一无所知:它使用 readline,它可以处理向上箭头历史记录等操作。看起来你要找的 REPL 是 readline?只需在希望从中获取 REPL 风格行为的命令前加上 rlwrap(如果尚未安装,请安装它-它非常不错),然后你就可以开始了。

$ rlwrap java -jar clojure.jar

这对于clj repl非常有效,但由于某些原因在scala repl中无法使用ctrl-r。看起来ghci已经使用了readline,所以很好。编辑:实际上,这对于clojure repl有巨大的影响-谢谢! - Matthew Gilliard
+1 for rlwrap:我开始使用它来学习Clojure,这使得学习变得更有趣了。 - coder_tim
这似乎回答了ctrl-r的问题,但没有回答REPL的问题。您只是将readline添加到已经执行repl的命令中。 - Tim Abell

5
Scala 2.9 REPL将支持CTRL-R反向搜索。夜间版本已经具备该功能。有上下文感知的Tab键自动补全已经存在一段时间了(尽管它可以改进)。
在使用scala和rlwrap时,请使用-Xnojline标志:
rlwrap scala -Xnojline

这可以防止jline干扰rlwrap。然后,rlwrap就可以自由使用readline来实现光标移动和历史记录,但是这是在解释器看到该行之前,你将无法使用语言感知完成。

我希望Scala REPL会得到改进。

  • 2.9中有一个演示编译器,我认为它用于突出显示错误和完成等功能。
  • Scala 2.9使用的jline能够使用ansi颜色,利用了jansi

因此,我可以梦想有一天在Scala REPL中拥有IDE级别的功能。实际上,这需要大量的努力,而添加这些功能肯定比改进eclipse支持的优先级低...此外,将REPL支持添加到eclipse中可能更有意义。


这似乎回答了ctrl-r的问题,但没有回答REPL的问题。您只是将readline添加到已经执行repl的命令中。 - Tim Abell

2
虽然不是严格意义上的REPL,但Seco提供了一个类似笔记本风格的shell,可以使用JSR-223绑定来评估任何语言的表达式。这个快速增长的列表包括像Javascript、Scheme、Python、Ruby、Clojure、Groovy和Prolog等语言。
Seco的灵感来自于Mathematica笔记本前端,理论上可以评估任何语言的表达式,尽管需要一些工作才能实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接