如何在 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 脚本),您有时可以在您的实现的初始化文件中添加东西。
假设我定义了一个宏
(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 脚本),您有时可以在您的实现的初始化文件中添加东西。