如何避免在Common Lisp项目中加载多个asdf文件?

5
在读Peter Seibel的书《实用Common Lisp》时,我发现在使用Emacs的SLIME和Quicklisp时如何处理Common Lisp包系统存在一些难度。他提供的项目具有以下结构: - 在包com.gigamonkeys.spam中的spam.lisp,依赖于另外两个包:cl-ppcre和com.gigamonkeys.pathnames。 - 在包com.gigamonkeys.pathnames中的pathnames.lisp。 - spam.asd,它描述了com.gigamonkeys.spam包的依赖项。 - pathnames.asd,它描述了com.gigamonkeys.pathnames包的依赖项。 目前,我发现的唯一构建最终目标spam.lisp的方法是: - 使用SLIME编译和加载路径名为pathnames.asd的文件(C-x C-k)。 - 在REPL中键入(asdf:operate 'asdf:load-op 'spam),以加载com.gigamonkeys.pathname包。 - 在REPL中键入(ql:quickload "cl-ppcre"),以加载cl-ppcre包。 - 使用SLIME编译和加载spam.asd文件。 - 在REPL中键入(asdf:operate 'asdf:load-op 'spam),以加载com.gigamonkeys.spam包。 这似乎是一个疯狂的工作量,只是为了使用单个文件spam.lisp中定义的函数 - 我一定做错了什么。是否有一种更简单的方法来加载spam.lisp及其依赖项?
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
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/pathnamesRET
  3. (push (truename ".") asdf:*central-registry*)
  4. ,cd~/src/lisp/spam-filterRET
  5. (push (truename ".") asdf:*central-registry*)
  6. (ql:quickload :spam-filter)
因为Quicklisp依赖ASDF加载系统,所以您需要将系统目录添加到ASDF搜索路径中。 您还可以通过将它们添加到~/quicklisp/local-projects/中来将您的系统放入Quicklisp的搜索路径。您可以在那里存储代码或使用符号链接。 PS:你可以在这里找到一个史莱姆快捷方式,使我能够写,addRET而不是(push(truename“。”)asdf:* central-registry *)。 而且正下方还有另一个史莱姆快捷方式,用于快速加载系统。 (,ql某些系统名称RET

非常抱歉耽搁了标记正确答案的时间,但这正是我所寻找的。感谢您清晰的解释! - zeptonaut

3

一些术语:

  • 是Common Lisp的一个标准特性,用于将符号划分到命名空间中。这只是一个命名空间,不是文件模块或任何其他东西的限制。它甚至不是一个功​​能、变量或类的命名空间,仅限于符号。约定俗成的做法是将设置包的定义放入自己的文件中,但这只是个惯例。

  • 系统用于定义、加载和编译构成软件库或应用程序的所有文件。关于系统的概念已经有30多年的历史了。 ASDF(Another System Definition Facility)是该想法的一种常见且免费的实现。Kent Pitman在1984年写了一篇关于大型系统描述的文章。

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,