如何避免为常见的lisp项目加载多个asdf文件?

can*_*ews 3 common-lisp slime quicklisp

在完成Peter Seibel的" Practical Common Lisp"一书时,我在理解如何与Emacs的SLIME和quicklisp一起处理Common Lisp包系统时遇到了一些困难.他提供的项目具有以下结构:

  • spam.lisp在包中com.gigamonkeys.spam,依赖于另外两个包,cl-ppcrecom.gigamonkeys.pathnames.
  • pathnames.lisp 在包中 com.gigamonkeys.pathnames
  • spam.asd,它描述了com.gigamonkeys.spam包的依赖关系
  • pathnames.asd,它描述了com.gigamonkeys.pathnames包的依赖关系

我目前发现构建最终目标spam.lisp的唯一方法是:

  1. pathnames.asd使用SLIME(C-x C-k)编译并加载文件
  2. com.gigamonkeys.pathname通过(asdf:operate 'asdf:load-op 'spam) 在REPL 键入来加载包
  3. cl-ppcre通过(ql:quickload "cl-ppcre")在REPL 键入来加载包
  4. spam.asd使用SLIME 编译并加载文件
  5. com.gigamonkeys.spam通过(asdf:operate 'asdf:load-op 'spam)在REPL 键入来加载包

这似乎是使用单个文件中定义的函数所需的大量工作(spam.lisp) - 我必须做错事.是否有一些方法可以spam.lisp用更少的命令加载和递归地加载它的依赖项?

Dai*_*rod 9

http://weitz.de/bart.gif

来源+全文

长话短说,包是符号袋和系统描述文件和其他系统之间的关系.

因此,在这里使用您的结构是一个简单的系统定义:

(asdf:defsystem #:spam-filter
  :serial t
  :description "Simple Spam Filter"
  :author "PCL"
  :depends-on (#:cl-ppcre
               #:com.gigamonkeys.pathnames)

  :components ((:file "package")
               (:file "spam")))
Run Code Online (Sandbox Code Playgroud)

现在,我假设系统com.gigamonkeys.pathnames~/src/lisp/com/gigamonkeys/pathnames/,垃圾邮件过滤器 ~/src/lisp/spam-filter/.

  1. M-xslimeRET
  2. ,cd〜/ src目录/口齿不清/ COM/gigamonkeys /路径名RET
  3. (push (truename ".") asdf:*central-registry*)
  4. ,cd〜/ SRC /口齿不清/垃圾邮件过滤器RET
  5. (push (truename ".") asdf:*central-registry*)
  6. (ql:quickload :spam-filter)

由于Quicklisp依赖ASDF加载系统,因此您需要在ASDF搜索路径中添加系统目录.

您还可以将系统添加到Quicklisp的搜索路径中~/quicklisp/local-projects/.您可以将代码存储在那里或使用符号链接.

PS:你可以在这里找到 一个粘液快捷方式,允许我写,addRET 而不是(push (truename ".") asdf:*central-registry*).

而在另一个粘液快捷方式下面快速加载系统.(,qlsome-system-nameRET)