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"
我只需要加载库.
(load "./A/util.lisp") (defun main () (ut:hello)) (main)
并运行'clisp main.lisp'工作正常.
您正在寻找的是所谓的系统.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
.
你必须在 main.lisp 之前加载 util.lisp:
> (load "util.lisp")
> (load "main.lisp")
> (main)
hello, world
NIL
Run Code Online (Sandbox Code Playgroud)
Practical Common Lisp对定义和使用包有很好的介绍。