Quicklisp QUICKLOAD应该放在哪里?无处?

时间:2012-03-23 00:06:37

标签: lisp common-lisp quicklisp allegro-cl

假设我在net.aservebordeaux-threads之上构建了一个应用程序。我的包声明可能如下所示:

(defpackage :my-package
  (:use :cl :net.aserve :bordeaux-threads)
  (:export …))

我使用Quicklisp,所以我在编译包之前在SLIME中运行(ql:quickload "aserve") (ql:quickload "bordeaux-threads"),一切都很好。

当然,明天我再次启动SLIME,我必须记得在编译之前发出QUICKLOAD,否则我就麻烦了。

可以添加类似

的内容
(eval-when (:compile-toplevel)
  (ql:quickload "aserve")
  (ql:quickload "bordeaux-threads"))

在我的软件包的顶部 - 这是我为开发所做的 - 但我觉得强迫用户使用软件包管理器不是一个好主意。

有更好的选择吗?

4 个答案:

答案 0 :(得分:12)

在您的asd文件中,您应该定义依赖实现,如下所示:''

(asdf:defsystem #:aserve
 :serial t
 :depends-on (#:hunchentoot :hunchentoot-cgi
           #::bordeaux-threads
           #:parenscript)
 ...)

之后你只需要(ql:quickload:aserve)。

答案 1 :(得分:11)

使用quickproject(可通过(ql:quickload :quickproject)访问)为您的应用创建系统。正如z_axis所描述的那样,您可以填写defsystem声明中的依赖项列表(如果您在调用quickproject:make-project时错过了任何依赖项)。

如果您在Quicklisp安装的local-projects路径中创建新项目,您也可以快速加载项目(即使它不是Quicklisp发行版的一部分)。快速加载项目当然会下载依赖项(如果它们是Quicklisp发行版的一部分),然后加载它们。

答案 2 :(得分:2)

我有完全相同的问题,我同意我不应该强迫用户使用包管理器。在quicklisp之前我使用clbuild并将所有.asd文件放入系统/目录。只要`系统/'目录位于asdf: central-registry ,可以简单地(需要" a-package"),至少在SBCL和CCL中,加载所有相关的包。如果您从上游安装,新的clbuild2保留此功能,并且其集成的quicklisp确实尊重单独安装的上游软件包,但quicklisp已安装的软件包不再公开其.asd文件。

所以我的解决方案是编写一个shell脚本,扫描所有quicklisp安装的软件包,通常在dists / quicklisp / software /下,并将所有.asd文件链接到一个中心位置。这样,如果只想使用quicklisp安装的软件包,则不需要将quicklisp加载到cl映像中。我希望quicklisp可以默认发布此功能。

答案 3 :(得分:2)

如果您根本不想在已部署的源代码中包含quicklisp调用,请将quickproject系统定义文件与其余源代码分开。

在源代码的顶部,就在defpackage调用之前,为您的包依赖项添加必要的(require ...)。这可以保证在继续之前(以某种方式)加载那些lisp包,但是没有指定这些包加载的“方式”。可以通过运行ql:quickload :my-package调用(使用quickproject)来加载它们,这将首先加载依赖项,然后在加载源时运行require调用。或者可能用户可以直接加载源(不调用ql:quickload),并且如果可以在*module-search-path*上找到那些依赖项,则会在require调用期间加载依赖项。正如您所说,这种技术将允许最终用户使用他/她想要加载源的任何构建工具。

在尝试了几分钟后,似乎quicklisp锁定到require函数调用,因此如果安装了quicklisp,并且调用(require :bordeaux-threads),则lisp将使用quicklisp下载并安装该函数依赖。这是一个非常好的功能(IMO),因为它允许Common Lisp标准require函数充当接口层,并抽象用于满足依赖性的特定构建工具。 Quicklisp可以锁定到require,asdf锁存器(IIRC)等

因此,为了回答您的问题,quicklisp调用不应该在已部署的源代码中的任何位置,并且requires应该用于确保在评估包定义文件之前加载依赖项。如果某人在加载包定义文件之前安装了quicklisp,则使用quicklisp下载并安装依赖项将满足这些要求。如果有人安装了asdf,那么这些依赖关系将满足该构建工具。如果有人已经安装了依赖项(使用其他技术),则只需要传递需求。