我已经在一些Lisp源文件中开发了一些Common Lisp函数,我希望这些函数可以轻松地用于我编写的其他函数,或者如果我认为它们对其他人有用,则可以在github上使用。现在,我只是将它们放在一些预先定义的文件夹中并使用(require "/path/to/my/modules/module.lisp")
。
我想了解定义Lisp模块库的正确(规范Lisp)方法是什么。问题的第二部分是如何使用它们(我是否已定义它们,或者我是否从其他人那里获得了它)。
我一直在阅读很多关于defpackage
和defsystem
以及asdf
的内容。但我读过的所有内容似乎都集中在这项任务的某个特定角落。我在查看自定义模块创建,部署和使用的大局方面遇到了很多麻烦。假设我在我面前有一个Lisp环境(CLISP或SBCL)和一个或多个.lisp
文件,我想创建一个包或库,是否有一个文件在某处解释了需要哪些步骤要做到这一点?这可能是我已经读过的东西,但由于不理解上下文而没有跟踪。我所读到的有关ASDF的内容在功能上似乎是我所追求的,但我不理解ASDF是否是我唯一的选择,或者它是否恰好是事实上的标准和大多数其他人使用或其他什么。我在SBCL玩了一下,并且不确定我是否正确使用它,并且没有看到如何在CLISP中设置它的信息。所以我想要了解什么是这个任务的中间,香草方法。
我知道这是一个很大的,草率的子问题。再说一次,如果有一些很好的参考资料,我可以阅读。我只是在查看它应该如何工作,以及是否有任何“最佳”方法,或者在Lisp中是否有点“狂野西部”选择图书馆时遇到一些麻烦 - 管理员 - 你喜欢的方法。我做了谷歌的事情,并阅读任何看起来相关的东西,但我的大脑正在全力以赴。
感谢。
答案 0 :(得分:6)
系统是文件和子系统的集合。可以编译或加载这样的系统。还有其他可能的操作。它跟踪依赖关系并尝试进行最少量的工作。
如果您使用的是SBCL和CLISP,那么 ASDF 就是您要选择的工具。见http://www.cliki.net/asdf
除其他事项外, ASDF 提供了DEFSYSTEM
宏来描述此类系统。
请勿使用PROVIDE
/ REQUIRE
- 除非您知道自己在做什么。 ASDF 是要走的路。
要发布您的代码并让其他人可以轻松加载,请使用 QUICKLISP 。请参阅:http://www.quicklisp.org/beta/
答案 1 :(得分:3)
Common Lisp中的包不像大多数其他意义上的包。它不是列表文件的存档,而是更像大多数其他语言所称的模块或命名空间,它允许您从代码中选择要显示给代码外部世界的符号(名称)。
如果你的小图书馆只有一个文件,你可以分发它。如果您有多个文件,那么像ASDF这样的工具可以确保,例如,在使用这些宏的文件之前加载定义宏的文件。
以下是一些很好的资源供您查看,这两个章节来自 Practical Common Lisp :
答案 2 :(得分:3)
ASDF和Quicklisp是有用的工具,这是既定事实。但是,我想就“图书馆”的概念提供另一种观点,因为它在以前的答案中进行了讨论
ASDF 旨在自动编译和加载一组源文件。对于CL来说, make 对于Unix是什么。在没有make的情况下编写和分发程序是完全有效的,就像在CL中编写一个不使用ASDF的程序一样好。
如果您的项目足够简单,那么提供一个文件(例如load.lisp
)就足够了,该文件包含以正确的顺序加载项目的相关文件的语句。因此,ASDF不参与图书馆的概念。
以挑衅的方式,我会说在CL中定义模块的规范方法是使用defpackage
声明,因为它是允许程序员将他/她的声明与其声明隔离的语言单元。别人。
然后是如何将其提供给其他人的问题。如果您编写可移植的CL代码,那么ASDF是最流行的系统定义工具,您应该使用它。如果你想让其他人更容易获得,那么Quicklisp是在过去几年中改变了CL面貌的工具。
最后,我想补充一点,ASDF和Quicklisp都不是标准,它们是工具(不会消除它们的用处)。 ANSI Common Lisp是一个标准,我很乐意看到CL中标准化的系统定义。
答案 3 :(得分: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文件。
答案 4 :(得分:1)
我设置了自己经常使用的库,使用ASDF系统定义并将它们链接到Quicklisp的local-projects
(或类似名称)文件夹中。这允许我像任何已发布的包一样使用quicklisp加载它们。
如果你想学习如何设置这样的ASDF系统,我建议你安装Quicklisp(一次性非常简单,当涉及到从互联网上安装'未完成'的软件时),快速加载一个众所周知的包或者两个并查看其.asd文件,如有疑问请查阅文档。
通过这种方式,您的库已经设置为像大多数着名的CommonLisp软件包一样发布。