[Bese-devel] CLISP + UCW + SLIME + REPL
vlado tzankov
vtzankov at gmail.com
Sat Nov 19 21:35:47 UTC 2005
Sorry in the previous mail i forgot that i have changed the
startup-backend
in the ucw araneida backend - file: src/backend/araneida.lisp
I have removed the last line:
;; #+clisp (araneida:host-serve-events))
since it starts a global "REPL" in the described configuration.
On Saturday, November 19, 2005, at 11:26 PM, vlado tzankov wrote:
> The modifications that i have made are:
>
> 1. SLIME
> Attached are the swank.lisp and swank-clisp.lisp.
> 1.1. swank.lisp
> when using the :fd-handler (and :sigio) communication style - the
> lambda passed to the add-fd-handler should have a single parameter -
> which is ignored in slime, but since the lambda is called now from the
> araneida - it should have a parameter. This change affects all
> backends that use fd-handler ot sigio (cmucl, single threaded sbcl).
> so the backends should be changed as well - (defimplementation
> add-fd-handler (socket fn)) should be changed in the backends to use
> the passed lambda.
> 1.2. swank-clisp.lisp
> the following functions are added to the file (no other
> modifications).
> (defimplementation preferred-communication-style ()
> (if (find-package 'araneida) :fd-handler nil))
>
> (defimplementation add-fd-handler (socket fn)
> (if (find-package 'araneida)
> (car (push (cons socket fn) (symbol-value (intern
> "*FD-HANDLERS*" "ARANEIDA"))))
> (error "trying to use araneida event handlers without having it
> loaded.")))
>
> (defimplementation remove-fd-handlers (socket)
> (if (find-package 'araneida)
> (setf (symbol-value (intern "*FD-HANDLERS*" "ARANEIDA"))
> (remove socket (symbol-value (intern "*FD-HANDLERS*" "ARANEIDA"))
> :count 1 :test (lambda (x y) (equal x (car y)))))
> (error "trying to use araneida event handlers withouit having it
> loaded")))
>
> 2. ARANEIDA
> The only change here is replacing the function HOST-SERVE-EVENTS in
> the the compat/compat-clisp.lisp with the following one:
>
> (defun host-serve-events ()
> (loop
> (let ((current-handlers (copy-list *fd-handlers*))
> (just-sockets (mapcar (lambda (pair)
> (if (eq (type-of (car pair)) 'stream)
> (list (car pair) :input)
> (list (car pair))))
> *fd-handlers*)))
> (loop for j in (socket:socket-status just-sockets) do
> (let ((x (find-if (lambda (pair) (eql (car j) (car pair)))
> current-handlers)))
> (if (or (eq (cdr j) t) (eq (cddr j) :INPUT))
> (if x (funcall (cdr x) (car x))))
> (if (and (eq (type-of (car j)) 'stream) (eq (cddr j) :EOF)) ;;
> we do not care about the server-socket, it cannot get :EOF status
> (host-remove-fd-handler x)))))))
>
> (there is consing at each request, but we have to live with it, since
> the handler of the request may change the *fd-handlers*)
>
> 3. And finally - the sequence in starting clisp and everything else
> i am using the following start script
>
> (in-package :common-lisp-user)
> (asdf:oos 'asdf:load-op 'araneida)
> (load (merge-pathnames "../slime/swank-loader.lisp" *load-truename*))
> (load (merge-pathnames "../ucw/bin/start.lisp" *load-truename*))
> (ucw:startup-server ucw:*default-server*)
> (swank:create-server :dont-close t)
> (araneida:host-serve-events)
>
> After this from emacs you can do slime-connect and go on.
>
> when you try all this - backup you slime files - for cmucl and single
> threaded sbcl (and all other that use :fd-handler or :sigio) a small
> patch to the backend should be made. for lisps that use :spawn
> (openmcl, mp sbcl) there should be no problems - but have not tested
> it.
>
> the host-serve-event in araneida is supposed to work fine - it is
> compatible with the original code.
> <swank-clisp.lisp><swank.lisp>
> br
> vlado
>
>
> On Saturday, November 19, 2005, at 12:13 PM, Marco Baringer wrote:
>
>> vlado tzankov <vtzankov at gmail.com> writes:
>>
>>> Hi,
>>>
>>> I just managed to patch SLIME and Araneida CLISP support, so I am
>>> able
>>> to run the UCW with Araneida backend and in the same time to connect
>>> with SLIME to the REPL of the running CLISP. Regardless of single
>>> threaded CLISP and lack of SERVE-EVENT functionality found in CMUCL
>>> and SBCL - it is possible to emulate the serve-event stuff with
>>> SOCKET-STATUS function in CLISP.
>>>
>>> So generally CLISP+Araneida+UCW behaves like a multi-threaded system.
>>
>> i could really use this :)
>>
>>> If somebody is interested I can post the changes here (or somewhere
>>> else) - btw the changes are tested only on OS X and CLISP 2.35.
>>
>> post them here.
>>
>> --
>> -Marco
>> Ring the bells that still can ring.
>> Forget the perfect offering.
>> There is a crack in everything.
>> That's how the light gets in.
>> -Leonard Cohen
>>
More information about the bese-devel
mailing list