Gol*_*den 4 lisp common-lisp asdf quicklisp
我目前正试图围绕包裹,系统和公司.
我现在已经阅读了包,系统,模块,库 - WTF?几次,我认为我仍然难以做到正确.
如果我只想将一个Lisp源文件拆分成两个文件,其中一个将"使用"另一个 - 我该怎么做?我需要为此构建一个系统吗?我应该使用模块吗?...?我来自Node.js背景,你可以简单地说
var foo = require('./foo');
Run Code Online (Sandbox Code Playgroud)
获取对文件中导出内容的引用foo.js.Lisp中与此最接近的是什么?
据我所知,ASDF适用于系统,并且它作为Quicklisp的一部分捆绑在一起,至少根据其文档:
ASDF捆绑了所有最新版本的活动Common Lisp实现以及quicklisp [...]
好吧,Quicklisp适用于图书馆,但他们的关系是什么?Quicklisp是其他语言中的"包管理器"吗?如果是这样,那么ASDF究竟提供了什么?
很抱歉这些问题很多,但我认为这只是说明我必须了解如何构建Lisp应用程序.任何帮助将不胜感激 :-)
系统
对于构建大型系统,请使用系统管理工具."免费"的是ASDF.
您需要一个系统声明,其中列出了您的库或应用程序的各个部分.通常它会进入自己的文件.然后加载系统或编译系统.应该有教程如何做到这一点.
一个简单的Lisp系统可能包含以下文件:
Quicklisp独立于此.这是一个软件分发工具.
快速编译和加载文件
但是,您也可以在没有系统工具的情况下以旧式方式编译和加载文件:
(defparameter *files*
'("/yourdir/foo.lisp" "/yourdir/bar.lisp"))
(defun compile-foobar ()
(mapc #'compile-file *files*))
(defun load-foobar ()
(mapc #'load *files*))
(defun compile-and-load ()
(mapc (lambda (file)
(load (compile-file file)))
*files*))
Run Code Online (Sandbox Code Playgroud)
实际上可能会有更多,但通常它就足够了.编写自己的构建工具应该很容易.典型的系统工具将提供更多功能,以便以结构化方式构建更复杂的软件.这些工具的许多想法至少可以追溯到35年.参见Lisp Machine手册,这里是1984年的版本,维护大型系统一章.
文件的作用
请注意,在普通的Common Lisp中,文件的作用及其语义并不是很复杂.
文件是不是一个名称空间,它是不具有相关联的类/子类或对象,它是不一个模块.您可以将Lisp构造混合在一个您想要的文件中.文件可以是任意大的(例如,一个复杂的库具有将其作为具有30000行的单个源文件传递的版本).文件扮演角色的标准语义中唯一真正的位置是编译文件时.编译文件有哪些副作用?编译器可以进行哪些优化?
除此之外,假设开发环境提供诸如加载和编译文件组(即系统)之类的服务,提供编译错误的概述,记录定义的源位置,可以定位定义等等.像ASDF这样的工具处理系统部分.