如何使用lisp(clisp)制作和使用库?

如何使用lisp(clisp)制作和使用库?,lisp,common-lisp,clisp,Lisp,Common Lisp,Clisp,在C/C++中,我可以创建一个库,并使用源代码中的#include“”和链接时的-labc使其成为静态库或dll。 如何在lisp中具有相同的功能 作为目录A中util.lisp的一个示例,我定义了一个库函数hello (defpackage "UTIL" (:use "COMMON-LISP") (:nicknames "UT") (:export "HELLO")) (in-package util) (defun hello () (format t "hello, wo

在C/C++中,我可以创建一个库,并使用源代码中的#include“”和链接时的-labc使其成为静态库或dll。 如何在lisp中具有相同的功能

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

(defpackage "UTIL" (:use "COMMON-LISP") (:nicknames "UT") (:export "HELLO")) (in-package util) (defun hello () (format t "hello, world")) (defpackage“UTIL” (:使用“COMMON-LISP”) (:昵称“UT”) (:导出“HELLO”)) (在包util中) (德芬你好() (格式t“你好,世界”)) 并尝试从main函数使用此库函数

(defun main () (ut:hello)) (main) (德芬大街) (ut:你好) (主要) 我试过了

clisp main.lisp A/util.lisp clisp main.lisp A/util.lisp 但是,我得到了以下信息

*** - READ from #: there is no package with name "UT" ***-从#读取:没有名为“UT”的包
  • 使用图书馆的“包含”等同于什么
  • 加载库的-lutil等效于什么?clisp/sbcl使用库的命令行是什么
  • 对于defpackage,这等同于名称空间吗
补充 我只是要把图书馆装进去

(load "./A/util.lisp") (defun main () (ut:hello)) (main) (加载“/A/util.lisp”) (德芬大街) (ut:你好) (主要)
然后运行“clisp main.lisp”可以正常工作。

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

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

实用的Common Lisp有很多优点。

Common Lisp是一种基于图像的语言,尽管其程度通常比Smalltalk小。这意味着您可以通过以下方式使用库:将库加载到映像中(如果显式地使用格式为
(load(compile file“your file here”))
),或者通常使用系统定义工具,如。加载的代码可用于将来编译/加载的所有代码


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

您要查找的是系统。Common Lisp的
defpackage
与此无关,是的,它与名称空间有关。请查看或(参见下面的Xach评论)以了解更多信息

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

(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和其他内容是要加载的lisp或fasl文件。此系统定义(通常命名为filename.asd)必须符号链接到(或位于)asdf:*central registry*中包含的目录,asdf才能找到您的系统。然后,您可以这样加载系统:

(asdf:oos 'asdf:load-op 'my-system)
ASDF的最新版本中增加了一个替代方案:

(asdf:load-system 'my-system)

或者,当使用slime时,按下
,l my system RET

“白痴指南”部分基于不准确的CLTL1信息。HyperSpec关于软件包的章节可读性很好,而且附带的好处是它们没有对软件包系统发表不准确的尖刻评论。Xach,我读《白痴指南》已经有一段时间了,即使我不记得很多细节,我确实记得,这是其中一种解释,对我理解这个概念有很大帮助。我在相关的HyperSpec部分添加了一个链接,并在“白痴指南”链接后添加了一个指向您评论的指针,以便读者可以查看规范、准确和非正式的信息来源。ASDF链接有点不完整。我在这里写了我是如何做到这一点的: