如何定义和使用公共Lisp包(库)?

如何定义和使用公共Lisp包(库)?,lisp,package,common-lisp,quicklisp,asdf,Lisp,Package,Common Lisp,Quicklisp,Asdf,我已经在几个Lisp源文件中开发了一些常见的Lisp函数,我希望这些函数可以轻松地用于我编写的其他函数,或者如果我认为它们对其他人有用,可以在github上使用。现在,我只是把它们放在一些预定义的文件夹中,并使用(require)/path/to/my/modules/module.lisp“ 我想了解定义Lisp模块库的正确方法(规范Lisp)。问题的第二部分是如何使用它们(我是否定义了它们,或者我是否从其他人那里获得了它们) 我读了很多关于defpackage和defsystem和asdf的

我已经在几个Lisp源文件中开发了一些常见的Lisp函数,我希望这些函数可以轻松地用于我编写的其他函数,或者如果我认为它们对其他人有用,可以在github上使用。现在,我只是把它们放在一些预定义的文件夹中,并使用
(require)/path/to/my/modules/module.lisp“

我想了解定义Lisp模块库的正确方法(规范Lisp)。问题的第二部分是如何使用它们(我是否定义了它们,或者我是否从其他人那里获得了它们)

我读了很多关于
defpackage
defsystem
asdf
的书。但我所读到的一切似乎都集中在这个任务中宇宙的某个特定角落。我很难看清定制模块创建、部署和使用的大局。因此,假设我面前有一个Lisp环境(CLISP或SBCL)和一个或多个
.Lisp
文件,我想用它们来制作一个包或库,那么是否有一个文档说明需要执行哪些步骤?这可能是我已经读过的东西,但由于不理解上下文而没有跟踪。我所读到的关于ASDF的内容在功能上似乎是我所追求的,但我不明白ASDF是否是我唯一的选择,或者它是否只是一个事实上的标准,以及大多数其他人使用什么,或者其他什么。我在SBCL中玩了一点,不确定我是否正确使用了它,也没有看到关于如何在CLISP中设置它的信息。因此,我想了解什么是完成这项任务的最基本、最普通的方法

我知道这是一个大的,草率的子问题集。再说一次,如果有一些好的参考资料,我可以阅读。我只是很难从整体上了解这是如何工作的,是否有任何“最佳”方法,或者在Lisp中是否有点“狂野西部”选择您喜欢的库管理器方法。我做了谷歌的事情,阅读了任何看起来相关的东西,但我的大脑正在从中旋转


谢谢。

Common Lisp中的包与其他大多数意义上的包不同。它不是列表文件的存档,更像大多数其他语言所称的模块或名称空间,允许您从代码中选择要向代码外部世界显示的符号(名称)

如果你的小图书馆只有一个文件,你可以分发它。如果有多个文件,则使用ASDF之类的工具来确保定义宏的文件在使用这些宏的文件之前加载

下面是一些很好的资源供您查看,这两章都来自实用的通用Lisp:

  • :这将使您更好地了解软件包是什么以及如何使用和为什么使用它们
  • :在“交付应用程序”一节中,通常有一些关于这方面的好资源,并提到了ASDF
系统是文件和子系统的集合。人们可以编译或加载这样的系统。还有其他可能的操作。它跟踪依赖关系,并尝试做最少的工作

如果您使用的是SBCL和CLISP,那么ASDF是可以选择的工具。看

除其他外,ASDF还提供了一个
DEFSYSTEM
宏来描述此类系统

不要使用
提供
/
要求
——除非你知道自己在做什么。ASDF是一条路要走


要发布代码并使其他人可以轻松加载,请使用QUICKLISP。请参阅:

是的,ASDF是事实上的标准,而Quicklisp是另一个标准

从Lisp的观点来看,您需要定义一个或多个名称空间(包)。这是由ANSI标准规定的。从代码的角度来看,您希望排列一组文件,使它们成为一个整体,并以某种方式提供这些包。这就是ASDF插入的地方。Quicklisp允许您以最简单的方式管理ASDF系统。您既可以从Quicklisp的存储库下载大量库,也可以在Quicklisp/local项目文件夹中创建符号链接来管理本地系统

如果已安装Quicklisp,则可以键入

(ql:quickload :cl-fad)
在REPL上加载CL-FAD库(可能下载);然后包CL-FAD和PATH变得可用,您忘记了ASDF系统,坚持包的逻辑


一个好主意是查看使用Quicklisp下载的几个项目的asd文件。

我设置了自己的库,我经常使用,使用ASDF系统定义并将它们链接到Quicklisp的
本地项目
(或类似命名)文件夹中。这使我可以像任何已发布的包一样使用quicklisp加载它们

如果您想了解如何设置这样一个ASDF系统,我建议您安装Quicklisp(这一次很容易,从internet安装“未完成”的软件),quickload一个或两个著名的软件包并查看其.asd文件,如有疑问,请查阅文档


通过这种方式,您的库已经设置为可以像大多数众所周知的CommonLisp软件包一样发布。

ASDF和Quicklisp是有用的工具,这是一个公认的事实。然而,我想就“图书馆”的概念提出另一种观点,正如前面的答案所讨论的那样

ASDF旨在自动编译和加载一组源文件。它对CL的意义就如同对Unix的意义一样。在没有make的情况下编写和分发程序是完全有效的,就像在CL中编写不使用ASDF的程序一样

如果您的项目足够简单,那么提供一个文件(例如,
load.lisp
)就足够了,该文件包含按正确顺序加载项目依赖文件的语句。所以