[slime-devel] Trying to wrap my head around slime-eval

Brad Beveridge brad.beveridge at gmail.com
Wed May 10 18:21:18 UTC 2006

Hi all, I'm looking at the slime source code and I am pretty puzzled
by slime-eval.

I think that I understand slime-rex, it sends an sexpr to Swank and
pushes a destructure-case continuation onto the global continuation
assoc list.  At sometime later Swank returns the evaluation of the
sexpr and calls either the :ok clause or the :abort clause.

The part that I am having trouble understanding is what parts of the
code are closed over by the continuation that is saved, and where
execution runs normally.

Looking at slime-eval, there needs to be two paths of execution, call
them A and B.
Path A is synchronous, slime-rex returns without throwing the tag. 
There is a while loop waiting on process-output, and the result of
that while is passed to (apply #'funcall <result-of-while>)  What is
the usual return here though?

Path B is a continuation.  The asynchronous return from Swank causes
either :ok or :abort to be thrown up to the (catch tag...) form, and
then (apply #'funcall....) will work on that.

Basically this all bends my mind, but is very cool at the same time. 
If somebody could please elaborate on what I have said, and correct me
I would really appreciate it.  There is probably a lot that I am not
getting just now :)  For example, why THROW?  Couldn't the
destructure-case sections just call/return the appropriate bits. 
Also, are there any ELisp/CommonLisp differences in this function?


More information about the slime-devel mailing list