5

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

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

我已经阅读了很多关于defpackageanddefsystem和的文章asdf。但我读过的所有内容似乎都集中在这项任务的某个特定领域。我在查看自定义模块创建、部署和使用的大局时遇到了很多麻烦。因此,假设我面前有 Lisp 环境(CLISP 或 SBCL)和一个或多个.lisp我想从中制作包或库的文件,是否有文档解释了执行此操作所需的步骤?这可能是我已经阅读过的内容,但由于不了解上下文而没有跟踪。我所读到的关于 ASDF 的内容在功能上似乎是我所追求的,但我不明白 ASDF 是否是我唯一的选择,或者它是否恰好是事实上的标准和大多数其他人使用的,或其他什么。我在 SBCL 中使用过它,但不确定我是否正确使用它,也没有看到有关如何在 CLISP 中设置它的信息。所以我想了解这个任务的中上层、普通方法是什么。

我知道这是一大堆草率的子问题。同样,如果有一些好的参考资料可供参考,我可以阅读。我只是无法全面了解它应该如何工作,以及是否有任何“最佳”方法,或者在 Lisp 中,它是否有点像“狂野西部”选择库-经理-你喜欢的方法。我做了谷歌的事情并阅读了任何看起来相关的东西,但我的大脑正在旋转。

谢谢。

4

5 回答 5

6

系统是文件和子系统的集合。一个人可以编译或加载这样一个系统。还有其他可能的操作。它跟踪依赖关系并尝试做最少的工作。

如果您使用的是 SBCL 和 CLISP,那么ASDF是可供选择的工具。见http://www.cliki.net/asdf

除其他外,ASDFDEFSYSTEM提供了一个宏来描述此类系统。

不要使用PROVIDE/ REQUIRE- 除非你知道你在做什么。ASDF是要走的路。

要发布您的代码并使其易于被其他人加载,请使用QUICKLISP。见:http ://www.quicklisp.org/beta/

于 2014-01-06T15:34:57.997 回答
4

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

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

这里有一些很好的资源供您查看,两章都来自Practical Common Lisp

于 2014-01-06T15:19:10.447 回答
3

ASDF 和 Quicklisp 是有用的工具,这是一个既定事实。但是,我想就“图书馆”的概念提出另一种观点,因为它已在以前的答案中讨论过

ASDF旨在自动编译和加载一组源文件。CL 之于 Unix, make之于 Unix。不使用 make 编写和分发程序是完全有效的,就像在不使用 ASDF 的 CL 中编写程序一样好。

如果您的项目足够简单,只需提供一个文件(例如load.lisp),其中包含以正确顺序加载项目的相关文件的语句。因此,ASDF 不涉及图书馆的概念。

以一种挑衅的方式,我想说在 CL 中定义模块的规范方法是使用defpackage声明,因为它是允许程序员将他/她的声明与其他人的声明隔离开来的语言单元。

然后是如何将其提供给其他人的问题。如果您编写可移植的 CL 代码,那么 ASDF 是最流行的系统定义工具,您应该使用它。如果您想让其他人更容易获得,那么 Quicklisp 是最近几年改变 CL 面貌的工具。

最后我想补充一点,ASDF 和 Quicklisp 都不是标准,它们是工具(不会影响它们的用处)。ANSI Common Lisp 是一个标准,我希望看到在 CL 中标准化的系统定义。

于 2014-01-07T16:57:10.497 回答
2

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

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

如果你安装了 Quicklisp,你可以输入

(ql:quickload :cl-fad)

在 REPL 并因此加载 CL-FAD 库(可能下载它);然后包 CL-FAD 和 PATH 变得可用,你忘记了 ASDF 系统并坚持包的逻辑。

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

于 2014-01-06T23:02:23.667 回答
1

我设置了我自己的库,我经常使用它,使用 ASDF 系统定义并将它们链接到local-projectsQuicklisp 的(或类似名称的)文件夹中。这允许我像任何已发布的包一样使用 quicklisp 加载它们。

如果您想了解如何设置这样的 ASDF 系统,我建议您安装 Quicklisp(这一次非常简单,当涉及从 Internet 安装“未完成”软件时),快速加载一两个众所周知的软件包并查看它的 .asd 文件,如有疑问,请查阅文档。

这样,您的库已经设置为可以像大多数众所周知的 CommonLisp 包一样发布。

于 2014-01-07T07:23:23.427 回答