5

在阅读 Peter Seibel 的书Practical Common Lisp时,我在理解如何结合 Emacs 的 SLIME 和 quicklisp 处理 Common Lisp 包系统时遇到了一些困难。他提供的项目结构如下:

  • spam.lisp在 packagecom.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. 通过在 REPLcom.gigamonkeys.pathname中键入来加载包(asdf:operate 'asdf:load-op 'spam)
  3. 通过在 REPLcl-ppcre中键入来加载包(ql:quickload "cl-ppcre")
  4. spam.asd使用 SLIME编译和加载文件
  5. 通过在 REPLcom.gigamonkeys.spam中键入来加载包(asdf:operate 'asdf:load-op 'spam)

使用单个文件spam.lisp(有没有办法spam.lisp用更少的命令来加载和递归地加载它的依赖项?

4

2 回答 2

10

来源+全文

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

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

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

  :components ((:file "package")
               (:file "spam")))

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

  1. M-xslimeRET
  2. ,cd~/src/lisp/com/gigamonkeys/路径名RET
  3. (push (truename ".") asdf:*central-registry*)
  4. ,cd~/src/lisp/垃圾邮件过滤器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)

于 2012-11-18T09:04:02.393 回答
3

一点术语:

  • 是Common Lisp 的标准功能。包是符号的命名空间。而已。它不是文件,不是模块,不是,也不与任何此类事物相关联。它甚至不是函数、变量或类的命名空间。只是为了符号。有一个约定是将设置包的定义放入它自己的文件中。但这只是一个约定。

  • 系统用于定义、加载和编译构成软件库或应用程序的所有文件。系统的想法是古老的(超过三十年)。ASDF(另一个系统定义工具)是该想法的流行且免费的实现。Kent Pitman 于 1984 年写了关于大型系统的描述

这种系统设施的一部分是注册表,可以从中找到所有系统。系统定义描述了它所包含的文件以及它所依赖的所有系统。通常,这样的注册表是文件系统中的目录和/或正在运行的 Lisp 中的注册表(变量,...)。

在加载特定系统时,系统工具会查看注册表并找到它,加载定义,递归加载所有需要的系统,然后加载所有文件。

请参阅 ASDF 手册:配置 ASDF 以查找您的系统

于 2012-11-18T09:04:46.510 回答