The current ClojureScript REPL is tied heavily to the use of Java's embedded Rhino. We lack the set of abstractions and tools that would allow us to:
- faster development on alternate JSVMs
- allowing the REPL to be used with evaluation environment specific code (browsers and node for example)
- ease of comparing how the same ClojureScript evaluates on multiple JSVMs
- the potential to evaluate the same code on multiple JSVMs simultaneously for compatibility testing
- protocolization of the evaluation component's communication model, allowing for either in-process or remote evaluators
- support multiple user interfaces: IDE, CLI; the "R" and "P"
- for network REPLs, build nrepl server on top of what we provide
- for in-process REPLs, build CLI on top of what we provide
- Right now, the REPL:
- sets up and tears down the evaluator (Rhino)
- changes compiler state when it sees
- knows the value of
*cljs-ns* for printing in prompt
- knows about
load-file, which uses the compiler
- has the responsibility of knowing about
*cljs-verbose* and printing intermediate compilation information
- Vision for REPL:
- An API that supports the idea of a purely presentational REPL
- input: form
- output: value, <exceptions, errors, compiler state as relevant to presentation, warnings>
- When using a browser for evaluation all side-effects happen in the browser. This includes printing things. Printed values should go to the console.
- Should we name the CrossPageChannel protocol CrossDomainChannel? Google thinks that is a better name but couldn't use it because it was already used. We are free use what is best for the protocol.
Status and TODO
- Add a new protocol for IEvaluator which is used by a console to evaluate forms and return a map containing user feedback to be printed.
- Extract console code from the current REPL and make it use the IEvaluator protocol.
- Add a timeout in the REPL. This should only exist in the browser-connected REPL.
- All of the old REPL code is still in cljs.compiler. This needs to be removed. Removing this code should solve some of the problems that users of OpenJDK have been having.
- Figure out how to implement *1, *2 etc in a way that is useful when evaluating in a browser.
- The REPL client code for the "inner page" of the CrossPageChannel doesn't work when compiled in advanced mode. Find out why. It is currently being compiled with simple optimizations.
- The most likely cause is that service names are registered as strings which refer to functions which get minified.