3

在 Common Lisp 中,quicklisp 是一种流行的库管理工具。我将使用该工具,并尝试使用 CL-WHO。我使用 SBCL 1.0.57 实现。我将在下面回答我自己的问题。

作为初学者,尚不清楚 ASDF 和 quicklisp 是如何实际协同工作的。因此,不清楚如何在外部源文件中实际使用您通过 quicklisp 下载的包或库。quicklisp 常见问题解答,至少目前没有帮助。在 python 中,这非常简单:您只需输入“import somemodule”,生活就很棒。是否有 CL+quicklisp 的等价物?

如果你搜索,你会发现很多结果。以下是我发现的一些最相关的:

Lisp 导入/加载文件

如何使用 quicklisp 安装的包?

当我最初阅读这些内容时,至少想到了一个问题:如果我使用的是 quicklisp,我真的需要关心 ASDF 吗?Quicklisp 似乎是一个更高级别的管理工具。其他人建议使用 quickproject。但这真的有必要吗?

4

2 回答 2

2

与 Python 导入的类比是系统定义……嗯,这是一个非常松散的类比,但是,这是要走的路。您在系统定义中声明依赖关系,然后在您希望它存在的源代码中声明依赖关系,因此如果您稍后引用外部代码的位,您只需执行此操作。

例如。在系统定义中你可能有:(通常它会在my-program.asd文件中)

(defsystem :my-program
  :version "0.0.1"
  :serial t
  :description "My program"
  :components ((:file "some-source-file"))
  ;; `some-external-package' here is the "import", i.e. here you
  ;; declared that you will be using code from this package.
  ;; ASDF will generally "know" how to get the code of that package
  ;; from here on. But if it doesn't, then there are ways to "help it"
  ;; similar to how in Python there's a procedure to prepare your local
  ;; files to be used by easy_install
  :depends-on (:some-external-package))

稍后在您的代码中,您只是假设some-external-package您的程序可以使用 ,例如:

(some-external-package:exported-symbol)

应该可以工作。(“您的代码”是您在组件中指定的 some-source-file.lisp)。

这是关于如何定义系统的 ASDF 文档

在您将这个文件放在ASDF 可能找到它的位置后*,假设您已经安装了 ASDF(可用于您的 Lisp,SBCL 与它捆绑在一起),您将使用(asdf:load-system :my-program) 这里的解释加载这个系统。

* - 一种快速测试它的方法是

(push "/path/to/your/system/definition/" asdf:*central-registry*)
于 2013-03-09T16:52:47.660 回答
0

通过 quicklisp 页面上的说明下载 cl-​​who 并运行:

#!/usr/bin/sbcl --script

(load "~/quicklisp/setup.lisp")
(ql:quickload "asdf")
(asdf:load-system 'cl-who)

(with-open-file (*standard-output* "out.html" :direction :output)
                (cl-who:with-html-output (*standard-output* nil :indent t)
                                  (:html
                                   (:head
                                    (:title "Test page"))
                                   (:body
                                    (:p "CL-WHO is really easy to use")))))

对于初学者或真正懒惰的人来说,没有理由必须在顶部写 3 行而不是只写 1 行(就像在 python 中一样)。

于 2013-03-08T21:28:37.693 回答