Error formatting macro: pagetree: java.lang.NullPointerException
Skip to end of metadata
Go to start of metadata
You are viewing an old version of this page. View the current version. Compare with Current  |   View Page History


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:

  • plug any JavaScript VM in as the "E" in our REPL, the advantages of which include:
    • 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

Research, ideas

  • Right now, the REPL:
    • sets up and tears down the evaluator (Rhino)
    • changes compiler state when it sees in-ns
    • 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.
  • The namespace clojure.browser.repl2 contains an implementation for both ends of the CrossPageChannel. Some of the code will be run by the parent page and some by the child iframe.

Status and TODO

  • Finish solving the single origin problem.
    • We are using Google Closure's XPC for this.
      • This is currently working but still needs improvement:
        • Update the working code (clojure.browser.repl2) to take full advantage of the api. Fix this api as needed. The current code in repl2 uses some raw Google Closure for things that didn't work in
        • The current working example works in FireFox and Safari. In Chrome keywords are getting munged. Follow the example is samples/repl2/src/repl/test.cljs to see the problem.
        • Keywords did not work as service names, most likely related to the above issue.
  • Change the current IEvaluator protocol to IJavaScriptEval. It is for evaluation of JavaScript strings.
  • Update the browser IJavaScriptEval implementation to allow for connections from multiple browsers.
  • 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.
  • Figure out what bootjs (in clojure.browser.repl.rhino) does and where it should go.
  • Add a timeout in the REPL. This should only exist in the browser-connected REPL.
  • Add a new REPL documentation page to the wiki.
  • Figure out how to implement *1, *2 etc in a way that is useful when evaluating in a browser.