9

在 C/C++ 中,我可以创建一个库,并在源代码中使用 #include "" 将其设为静态库,并在链接时使用 -labc 将其设为静态库。我如何在 lisp 中拥有相同的功能?

作为目录 A 中 util.lisp 的示例。我定义了一个库函数 hello。

(defpackage "UTIL"
  (:使用“COMMON-LISP”)
  (:昵称“UT”)
  (:出口“你好”))

(包内实用程序)
(defun你好()
  (格式t“你好,世界”))

并尝试从主函数中使用这个库函数。

(定义主()
  (ut:你好))
(主要的)

我试过了

clisp main.lisp A/util.lisp 

但是,我收到以下消息

*** - 从 # 读取:没有名称为“UT”的包
  • #include "" 等效于使用该库是什么?
  • 加载库的 -lutil 等效项是什么?clisp/sbcl 使用该库的命令行是什么?
  • 而对于 defpackage,这是否等同于命名空间?

添加

我只需要加载库。

(加载“./A/util.lisp”)

(定义主()
  (ut:你好))

(主要的)

并运行“clisp main.lisp”工作正常。

4

3 回答 3

7

您正在寻找的是所谓的系统。Common Lispdefpackage与此无关,是的,它与命名空间有关。查看HyperSpec白痴指南(请参阅下面 Xach 的评论)以了解更多信息。

您可以限制自己仅加载文件,但通常会使用系统定义工具;现在主要是ASDF。一个最小的例子:

(defsystem my-system
  :name "my-system"
  :version "0.0.1"
  :author "myself"
  :license "LLGPL"
  :description "it's a system."
  :serial t
  :components ((:file "packages")
               (:file "stuff")
               (:file "more_stuff")))

其中 packages.lisp 将包含包定义, stuff 和 more_stuff 是要加载的 lisp 或 fasl 文件。此系统定义(通常命名为 filename.asd)必须符号链接到(或位于)包含的目录,asdf:*central-registry*以便 ASDF 找到您的系统。然后,您可以这样加载系统:

(asdf:oos 'asdf:load-op 'my-system)

在最新版本的 ASDF 中添加了一个替代方案:

(asdf:load-system 'my-system)

或者,在使用粘液时,按,l my-system RET

于 2010-09-29T06:15:07.273 回答
5

您必须在 main.lisp 之前加载 util.lisp:

> (load "util.lisp")
> (load "main.lisp")
> (main)
hello, world
NIL

Practical Common Lisp对定义和使用包有很好的介绍

于 2010-09-29T06:04:40.473 回答
1

Common Lisp 是一种基于图像的语言,尽管通常程度低于 Smalltalk。这意味着您可以通过将库加载到图像中来使用库,使用LOAD(如果经常在 form 中明确使用(load (compile-file "your-file-here"))),或者通常使用像ASDF这样的系统定义工具。然后,加载的代码可用于将来编译/加载的所有代码。

包确实是命名空间。它们仅处理将字符串映射到符号,它们不直接连接到文件或函数或其他任何东西。您收到包错误,因为您试图在定义它的文件之前使用包加载文件。

于 2010-09-29T06:09:51.433 回答