我使用 ADSF 来组织我的项目。
(asdf:defsystem :sender
:version "0.1.4"
:serial t
:depends-on (:cl-json :dexador :clsql :clsql-sqlite3)
:components ((:file "packages")
(:file "validation")
(:file "sender")))
但是当我打开一个新的 repl(slime、emacs)时,我必须先转到 packages.lisp 文件并评估表单,然后才能使用 (in-package :sender) 将 repl 更改为该包
.
有没有办法让 slime repl 记住我的包裹?
我目前的想法是我需要“运行”adsf 来加载我的所有文件。如果是这样,怎么办?
更新:
实际上,我需要手动编译所有文件,然后才能在 repl 中主动使用它们。我相信我错误地使用了 asdf。
最佳答案
根据 .asd 系统定义,步骤如下:
- 编译.asd文件,以便你的Lisp镜像了解系统
C-c C-k
或以编程方式:(asdf:load-asd "system")
。
- 以某种方式加载它:
(ql:quickload "system")
以安装依赖项- 或
(asdf:load-system "system")
,但如果您的项目具有未知的依赖项,则会失败,Quicklisp 会下载它们。 - 避免对 asdf 系统使用
cl:load
,load-asd/load-system 会做更复杂的事情。
- 或
- 在 REPL 上使用它。在packages.lisp 文件中定义的包应该可用,因为该文件是在.asd 中声明的。
您可以将内容添加到您的~/.sbclrc
(或其他实现的类似内容)。在这里,我告诉 ASDF 项目所在的位置,这样我就可以快速加载
它,而无需之前手动编译 .asd:
(pushnew "/home/vince/projets/ciel/" asdf:*central-registry* :test #'equal)
这是 ASDF 文档不再鼓励的“旧”风格。
或者简单地为您的项目创建一个指向 ~/quicklisp/local-projects/
或 ~/common-lisp/
的符号链接(symbolic link)。
我不会在初始化文件中“加载系统”我的项目,因为这是一个副作用,有时当我不想要它时会显示出来(例如构建图像:如果这涉及读取我的初始化文件,我里面会有一个不需要的系统)。
保存具有大量依赖项的核心镜像很酷。将其与 sbcl --core ... 一起使用。优点是它在 REPL 中立即启动,加载所有项目和依赖项需要几秒钟。
关于common-lisp - 为什么我需要评估新 REPL 的 defpackage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75027457/