I'd like to know if there is a REPL which is not language-specific. I spend a lot of time dipping in and out of REPLs (mainly for Clojure, Scala and Haskell), and the bundled ones all frustrate me to a greater or lesser extent. It seems like the job of a REPL is quite generic in that they:
- Read: take user input
- Evaluate: pass the input to some runtime for processing
- Print: print the results to the screen
- Loop: wait for the next user input
I don't see why there shouldn't be some language-agnostic REPL, but I have been unable to find such a thing. Some things I would like in my ideal REPL:
- Linux command-line application
- Infinite history accessible through the up arrow
- Ability to edit previous commands before re-running
- ctrl-r for history search like bash has
- Multiple sessions in one REPL, so I can switch between them easily
And more optimistically
- syntax highlighting, context-aware code completion
Does this exist?
Bash doesn't know anything about C-r
: it uses readline, which does that, as well as up-arrow history, for it. It sounds like the REPL you're looking for is readline? Just prefix the command you want REPL-like behavior from with rlwrap (install it if you don't have it - it's great), and you should be good to go.
$ rlwrap java -jar clojure.jar
Scala 2.9 REPL will have CTRL-R reverse search support. The nightly builds have that already. There has been context aware tab completion for a while (though it could be improved).
When using scala with rlwrap
, use the -Xnojline flag:
rlwrap scala -Xnojline
That prevents jline from interfering with rlwrap. Then rlwrap is free to use readline to implement cursor motions and history but that is before the interpreters sees the line and you won't have language-aware completion.
I hope that the Scala REPL will be improved.
- There is a presentation compiler that is part of 2.9 which I think is used for things like highlighting errors and completion.
- The jline used by scala 2.9 is capable of using ansi colors leveraging jansi
So I can dream that one day I will have IDE level feature in the Scala REPL. Realistically, it would require substantial effort and adding these features is surely lower priority than improving eclipse support for instance... Besides it may make more sense to add REPL support in eclipse.
While not strictly speaking a REPL, Seco offers a notebook-style shell that can evaluate expressions in any language with a JSR-223 binding. This rapidly growing list includes languages like Javascript, Scheme, Python, Ruby, Clojure, Groovy and Prolog.
Seco's inspiration, the Mathematica notebook front-end, can in principle evaluate expressions in any language although it takes some work to make that happen.