如何在 LISP (sbcl) 中永久保存宏

How to permanently save a macro in LISP (sbcl)

假设我定义了一个宏

(defmacro foo(x)
    (print x))

现在我希望以后能够在我所有的 lisp 文件中始终加载这个宏我应该把这个宏保存在哪里?

每个 CL 实现都有一个在启动时调用的初始化文件。对于 SBCL,它是 ~/.sbclrc。如果你安装了 quicklisp,quicklisp 通常也有一些设置代码。

所以你可以添加一行:

(load #P"path/to/your/macro/file.lisp")

它会在您每次启动 SBCL 时加载。

您想拥有一个图书馆。

一个库可以包含任意数量的定义,而不仅仅是宏。

定义系统(这是库、框架和应用程序的更通用术语——软件单元)的事实上的标准方法是使用 ASDF。

假设您将宏放入 lisp 文件中:

;;;; my-util.lisp

(in-package cl-user)

(defpackage my-util
  (:use cl))

(in-package my-util)

(defmacro foo (x)
  `(whatever ,x etc))

然后你把它放在 ASDF 已知的目录下。一个有用的目录是 ~/common-lisp/,所以让我们使用 ~/common-lisp/my-util/。在同一目录下,放置系统定义文件:

;;;; my-util.asd

(in-package asdf-user)

(defsystem "my-util"
  :components ((:file "my-util")))

现在您可以将此实用程序加载到任何 lisp 交互中,例如。 G。关于回复:

CL-USER> (asdf:load-system "my-util")

或者在不同的系统中:

;;;; my-application.asd

(in-package asdf-user)

(defsystem "my-application"
  :depends-on ("my-util")
  ...)

对于实用程序库,您通常希望 use 它们的包,这样您就不需要 package-qualify 符号。

如果您想要只在您的计算机上工作的东西(比如您的 REPL 使用的快捷方式或 one-off 脚本),您有时可以在您的实现的初始化文件中添加东西。