(The "Eval" button is just there in case pressing enter doesn't work for you. This may be useful on mobile in particular.)
Above is a REPL for Rainbow.js, an implementation of most of
Rainbow, which is an implemenation of Arc. By default, we don't load
arc.arc or friends automatically yet, but you can enter
(load-from-web) to load them manually or
put "#libs" on the end of the URI to refresh the
page such that the libraries are loaded automatically.
Besides load-from-web, this REPL defines another
global: window, the page's window object. You can use
it with (the poorly named) java-invoke like so
(assuming no libraries loaded):
arc> (assign list (fn a a))
(fn a a)
arc>
(assign jsget-impl
(java-invoke
window 'eval (list "(function ( o, k ) { return o[ k ]; })")))
function ( o, k ) { return o[ k ]; }
arc>
(assign jsget
(fn (o k) (java-invoke jsget-impl 'call (list nil o k))))
(fn (o k) (java-invoke jsget-impl 'call (list nil o k)))
arc> (jsget window "Object")
function Object() { [native code] }
Using arbitrary JavaScript code like this, you could poke around in Rainbow.js's internals. However, all the JavaScript code this page uses is minified, so if you have a goal that ambitious, we recommend actually checking out the Rainbow.js repo and modifying the source code. :-p
The java-invoke function takes care of some simple
type conversions for you, like converting between host-language
strings and Arc strings automatically:
arc>
(+ "The title of the page is: "
(jsget (jsget window "document") "title"))
"The title of the page is: It's Rainbow in JavaScript!"