;;; -*- lisp -*- ;; ASDF system definition for loading the Swank server independently ;; of Emacs. ;; ;; This is only useful if you want to start a Swank server in a Lisp ;; processes that doesn't run under Emacs. Lisp processes created by ;; `M-x slime' automatically start the server. ;; ;; If Swank is already loaded (e.g. the Lisp is running under SLIME), ;; then attempts to load it via asdf do nothing, except for emitting a ;; warning if Swank is to be loaded from a location that's different ;; from the location where it was originally loaded from. This ;; behavior is intended to prevent loading a possibly incompatible ;; version of Swank with a running SLIME. ;; Usage: ;; ;; (require :swank) ;; (swank:create-swank-server PORT) => ACTUAL-PORT ;; ;; (PORT can be zero to mean "any available port".) ;; Then the Swank server is running on localhost:ACTUAL-PORT. You can ;; use `M-x slime-connect' to connect Emacs to it. ;; ;; This code has been placed in the Public Domain. All warranties ;; are disclaimed. (defclass swank-loader-file (asdf:cl-source-file) ()) ;;;; after loading run init (defmethod asdf:perform ((o asdf:load-op) (f swank-loader-file)) (let ((var (uiop:find-symbol* '#:*source-directory* '#:swank-loader nil))) (cond ((and var (boundp var)) (let ((loaded (truename (symbol-value var))) (requested (truename (asdf:system-source-directory "swank")))) (unless (equal requested loaded) (warn "~@<Not loading SWANK from ~S because it was ~ already loaded from ~S.~:@>" requested loaded)))) (t ;; swank-loader computes its own source/fasl relation based ;; on the TRUENAME of the loader file, so we need a "manual" ;; CL:LOAD invocation here. (load (asdf::component-pathname f)) ;; After loading, run the swank-loader init routines. (funcall (read-from-string "swank-loader::init") :reload t))))) (asdf:defsystem :swank :default-component-class swank-loader-file :components ((:file "swank-loader")))