common-lisp - 为什么我需要评估新 REPL 的 defpackage?

标签 common-lisp read-eval-print-loop sbcl asdf

我使用 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/

相关文章:

lisp - lisp中的字符串加法赋值

list - 在 Lisp 中替换列表小节的最惯用方法

ruby - 类似于 Ruby 交互式控制台的 IDLE

javascript - 从nodejs中的文件加载javascript

lisp - 帮助使用 Lisp 调试器

lisp - 如何将给定八位位组(字节)的最后 n 位设置为零?

python - SBCL 运行 Shell 命令

python - 在输入提示中启用箭头键导航

common-lisp - 使用 SLIME 在 Aquamacs 中编译 SBCL defun 时出现类型错误

lisp - delete-if 中谓词的多个参数