Adding turtle
[lambdamundo.git] / repl.lisp
blob835258463fa0bda26ba5ae528d10ddc9af5a3172
2 (in-package :lambdamundo)
4 ;; (unless (find-package :swank)
5 ;; (swank-loader:init))
8 (defparameter *swank-port* nil)
9 (defparameter *service-slime* t)
11 (in-package :swank)
13 (defun start-session (port)
14 "Starts a swank session and returns "
15 (let* ((announce-fn #'simple-announce-function)
16 (external-format (find-external-format-or-lose *coding-system*))
17 (socket (create-socket *loopback-interface* port))
18 (local-port (local-port socket)))
19 (declare (type function announce-fn))
20 (funcall announce-fn local-port)
21 (format *debug-io* "Swank on port ~A " local-port)
22 (initialize-multiprocessing
23 (lambda ()
24 (spawn (lambda ()
25 (loop do
26 (ignore-errors
27 (serve-connection socket :spawn t external-format))
28 while lambdamundo::*service-slime*))
29 :name
30 (concatenate 'string "Swank "
31 (princ-to-string port)))))
32 local-port))
34 (defun end-session (port)
35 "Stop server running on PORT."
36 (let* ((socket-description (getf *listener-sockets* port))
37 (socket (second socket-description)))
38 (let ((thread-position
39 (position-if
40 (lambda (x)
41 (string-equal (first x)
42 (concatenate 'string "Swank "
43 (princ-to-string port))))
44 (list-threads))))
45 (when thread-position
46 (kill-nth-thread thread-position)
47 (close-socket socket)
48 (remf *listener-sockets* port)))))