在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"
我只需要加载库。
(load "./A/util.lisp") (defun main () (ut:hello)) (main)
运行'clisp main.lisp'工作正常。
答案 0 :(得分:5)
您正在寻找的是系统。 Common Lisp的defpackage
与此无关,是的,它与命名空间有关。请查看HyperSpec或idiot'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)