A hack for using slime with things like parenscript and 3bil that compile code on a host lisp then run it somewhere else.
Currently only usable with parenscript, using websockets for communication between host lisp and browser.
- currently only works on sbcl, since clws hasn't been ported to other lisps yet, though such a port would only take an hour or so
- Modified parenscript. Either 3b's fairly up-to-date branch or gonzojive's older one (for best results you will usually want slime-proxy and parenscript from the same place)
- clws
- websockets emulation for browsers without native support, included as a git submodule (Websockets is available natively in Firefox4, but is disabled due to security concerns. You can enable it in about:config, or use the flash emulation.)
- misc libraries: ironclad, anaphora, cl-ppcre, yason (see .asd files for exact list)
slime-proxy comes with slime-parenscript, which a means of interacting with browser-side Javascript through Common Lisp and SLIME. Here we describe how to install both:
Put the following into ~/.emacs to tell emacs where to find slime-proxy
and slime-proxy-parenscript, adjusting path/to/slime-proxy/ as needed:
(add-to-list 'load-path "path/to/slime-proxy/")
(add-to-list 'load-path "path/to/slime-proxy/contrib/slime-parenscript/")
Put the following into ~/.swank.lisp to tell swank how to load the
CL parts, adjusting path/to/slime-proxy/ as needed again:
(push #P "path/to/slime-proxy/" swank::*load-path*)
(push #P "path/to/slime-proxy/contrib/slime-parenscript/" swank::*load-path*)
Since slime-proxy is rather annoying to load by default, add the
following function to ~/.emacs:
(defun slime-proxy-setup ()
(interactive)
(slime-setup '(slime-proxy slime-parenscript)))
Then, after restarting emacs or evaluating the forms added to .emacs
and .swank.lisp by hand, M-x slime-proxy-setup will load
slime-proxy (but not start it, you can probably add a call to
(slime-proxy) to slime-proxy-setup if you want that). Once it is
loaded, you can start it with M-x slime-proxy. It will prompt you
for "Target for proxy," to which you should type "ps". Now you have
got a REPL, and when you hit C-c C-c etc. inside of .paren files,
they will be compiled from Parenscript to Javascript and sent to any
connected browser.
Note that the lisp side of slime-proxy-parenscript can take a while
to load all its dependencies (particularly if they haven't been
compiled yet), during which time emacs will not respond, and just show
a 'busy' cursor. To avoid this, you can load swank-parenscript
through asdf before starting slime-proxy.
(If you want to load slime-proxy by default, you can add
slime-proxy and slime-parenscript to an existing slime-setup
call instead of using slime-proxy-setup)
Load the file contrib/slimy/slimy.html in a web browser on
localhost. Point your web browser there
switch an emacs buffer to proxy mode:
M-: (setq slime-proxy-proxy-connection t) RET
or
;;; -*- Mode: LISP; slime-proxy-proxy-connection: t -*-
You may need to adjust URLs/ports in contrib/slimy/slimy.html and
wsproxy.lisp (see *swank-proxy-port* in the latter), but probably
not. The default is 12344.
(If clients are loading page from somewhere other than localhost, add
the host to the (ws:origin-prefix "http..." ...) form in
wsproxy,lisp)
- compile/eval with
C-c C-c,C-c C-k,M-C-x,C-x C-eand REPL - non-autodoc arglist display (including introspecting from browser if possible)
M-.- connection to multiple browsers at once (currently just sends everything to all connected browsers, so can behave a bit oddly. seems like it might be useful enough to try to figure out how to make it work sanely though)
- autodoc
- debugger
- pretty much everything else :p