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

时间:2010-09-29 02:58:28

标签: lisp common-lisp clisp

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

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

(defpackage "UTIL"
  (:use "COMMON-LISP")
  (:nicknames "UT")
  (:export "HELLO"))

(in-package util)
(defun hello ()
  (format t "hello, world"))

并尝试从main函数使用此库函数。

(defun main ()
  (ut:hello))
(main)

我试过

clisp main.lisp A/util.lisp 

但是,我收到了以下消息

*** - READ from #: there is no package with name "UT"
  • 使用库的#include“”相当于什么?
  • 什么相当于-lutil加载库? clisp / sbcl使用该库的命令行是什么?
  • 对于defpackage,这是否等同于命名空间?

ADDED

我只需要加载库。

(load "./A/util.lisp")

(defun main ()
  (ut:hello))

(main)

运行'clisp main.lisp'工作正常。

3 个答案:

答案 0 :(得分:5)

您正在寻找的是系统。 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

答案 1 :(得分:4)

您必须在main.lisp:

之前加载util.lisp
> (load "util.lisp")
> (load "main.lisp")
> (main)
hello, world
NIL

实用Common Lisp有a good introduction to defining and using packages

答案 2 :(得分:1)

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

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