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

pro*_*eek 9 lisp clisp common-lisp

在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,这是否等同于命名空间?

添加

我只需要加载库.

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

(defun main ()
  (ut:hello))

(main)

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

dan*_*lei 6

您正在寻找的是所谓的系统.Common Lisp defpackage与此无关,是的,它与命名空间有关.查看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")))
Run Code Online (Sandbox Code Playgroud)

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

(asdf:oos 'asdf:load-op 'my-system)
Run Code Online (Sandbox Code Playgroud)

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

(asdf:load-system 'my-system)
Run Code Online (Sandbox Code Playgroud)

或者,当使用粘液时,按下,l my-system RET.


Vij*_*hew 5

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

> (load "util.lisp")
> (load "main.lisp")
> (main)
hello, world
NIL
Run Code Online (Sandbox Code Playgroud)

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