【问题标题】:How to make and use library with lisp (clisp)?如何使用 lisp (clisp) 制作和使用库?
【发布时间】:2010-09-29 02:58:28
【问题描述】:

在 C/C++ 中,我可以创建一个库,并在源代码中使用 #include "" 和在链接时使用 -labc 将其设为静态库或 dll。 我如何在 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' 工作正常。

【问题讨论】:

标签: lisp common-lisp clisp


【解决方案1】:

您正在寻找的东西称为系统。 Common Lisp 的defpackage 与此无关,是的,它与命名空间有关。查看HyperSpecidiot's guide(请参阅下面 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

【讨论】:

  • “白痴指南”部分基于不准确的 CLTL1 信息。 HyperSpec 关于包的章节非常易读,并且附带的好处是它们没有加载针对包系统的不准确的尖刻评论。
  • Xach,我已经有一段时间没有阅读白痴的指南了,即使我不记得很多细节,但我确实记得这是对我帮助很大的解释之一理解这个概念。我在相关的 HyperSpec 部分添加了一个链接,并在白痴指南链接后面添加了指向您评论的指针,以便读者可以查看规范、准确和非正式的信息来源。
  • ASDF 链接有点损坏。
【解决方案2】:

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

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

Practical Common Lisp 有a good introduction to defining and using packages

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-14
      • 2012-01-13
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      • 2015-08-19
      • 1970-01-01
      • 2019-08-26
      相关资源
      最近更新 更多