While working through Peter Seibel's book Practical Common Lisp, I've had some difficulty understanding how to handle the Common Lisp package system in conjunction with Emacs's SLIME and quicklisp. The project he supplies has the following structure:
spam.lisp
in the package com.gigamonkeys.spam
, which relies on two other packages, cl-ppcre
and com.gigamonkeys.pathnames
. pathnames.lisp
in the package com.gigamonkeys.pathnames
spam.asd
, which describes the dependencies of com.gigamonkeys.spam
packagepathnames.asd
, which describes the dependencies of the com.gigamonkeys.pathnames
packageThe only way that I've currently found to build the final target, spam.lisp, is to:
pathnames.asd
file using SLIME (C-x C-k
)com.gigamonkeys.pathname
package by typing (asdf:operate 'asdf:load-op 'spam)
at the REPLcl-ppcre
package by typing (ql:quickload "cl-ppcre")
at the REPLspam.asd
file using SLIMEcom.gigamonkeys.spam
package by typing (asdf:operate 'asdf:load-op 'spam)
at the REPLThis seems like an insane amount of work required to use the functions defined in a single file (spam.lisp
) - I've got to be doing something wrong. Is there some way to load spam.lisp
and, recursively, its dependencies, with fewer commands?
Source + Full Story
Long story short, packages are bags of symbols and systems describe relationships between files and other systems.
So, using your structure here is a simple system definition:
(asdf:defsystem #:spam-filter
:serial t
:description "Simple Spam Filter"
:author "PCL"
:depends-on (#:cl-ppcre
#:com.gigamonkeys.pathnames)
:components ((:file "package")
(:file "spam")))
Now, I'll suppose the system com.gigamonkeys.pathnames
is in
~/src/lisp/com/gigamonkeys/pathnames/
and the spam filter in
~/src/lisp/spam-filter/
.
slime
RET
(push (truename ".") asdf:*central-registry*)
(push (truename ".") asdf:*central-registry*)
(ql:quickload :spam-filter)
Because Quicklisp relies on ASDF to load systems, you've to add the systems directories in ASDF search-path.
You could also put your systems in Quicklisp's search path by adding
them in ~/quicklisp/local-projects/
. You can either store your code
there or use symbolic links.
PS: You can find
here
a slime-shortcut that allows me to write ,addRET
instead of (push (truename ".") asdf:*central-registry*)
.
And just below another slime-shortcut to quickload a system.
(,qlsome-system-name
RET)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With