代码之家  ›  专栏  ›  技术社区  ›  prosseek

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

  •  9
  • prosseek  · 技术社区  · 14 年前

    如何在lisp中具有相同的功能?

    例如实用程序.lisp我定义了一个库函数hello。

    (defpackage "UTIL"
      (:use "COMMON-LISP")
      (:nicknames "UT")
      (:export "HELLO"))
    
    (in-package util)
    (defun hello ()
      (format t "hello, world"))
    

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

    我试过了

    clisp main.lisp A/util.lisp 
    

    但是,我得到了以下信息

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

    我只是要把图书馆装进去。

    (load "./A/util.lisp")
    
    (defun main ()
      (ut:hello))
    
    (main)
    

    然后运行clispmain.lisp语言“很好。

    3 回复  |  直到 14 年前
        1
  •  5
  •   Vijay Mathew Chor-ming Lung    14 年前

    你得装东西实用程序.lisp之前main.lisp语言:

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

    a good introduction to defining and using packages .

        2
  •  7
  •   danlei    13 年前

    你要找的东西叫做 系统 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")))
    

    哪里包.lisp将包含包定义、stuff和更多内容是要加载的lisp或fasl文件。此系统定义(通常称为文件名.asd)必须符号链接到(或位于)中包含的目录 asdf:*central-registry* 让ASDF找到你的系统。然后,您可以这样加载系统:

    (asdf:oos 'asdf:load-op 'my-system)
    

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

    (asdf:load-system 'my-system)
    

    或者,使用粘液时,通过按压 ,l my-system RET .

        3
  •  1
  •   Ramarren    14 年前

    CommonLisp是一种基于图像的语言,尽管通常比Smalltalk的程度要小。这意味着您可以通过使用将库加载到图像中来使用库 LOAD (如果显式使用,则通常为 (load (compile-file "your-file-here")) ASDF

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