Как сделать и использовать библиотеку с lisp (clisp)?

в C / C++ я могу сделать библиотеку и сделать ее статической или dll, используя #include "" в исходном коде и-labc при связывании. Как у меня есть такая же функция в lisp?

в качестве примера util.lisp в каталоге A. Я определяю библиотечную функцию 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"
  • что эквивалент #include "" для использования библиотеки?
  • что такое эквивалент-lutil для загрузки библиотеки? Что такое командная строка для clisp / sbcl для использования библиотеки?
  • и для defpackage, это эквивалентно пространству имен?

добавил

мне просто нужно было загрузить библиотеку.

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

(defun main ()
  (ut:hello))

(main)

и запустите ' clisp main.сюсюкать' работает отлично.

3 ответов


вы должны загрузить util.шепелявить перед главным.lisp:

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

практический общий 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")))

где пакеты.lisp будет содержать определение пакета, stuff и more_stuff-это загружаемые файлы lisp или fasl. Это определение системы (обычно называется именем.asd) должен быть символически связан (или расположен) с каталогом, содержащимся в asdf:*central-registry* для ASDF, чтобы найти вашу систему. Затем вы можете загрузить систему таким образом:

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

альтернатива этому была добавлена в более поздних версиях ASDF:

(asdf:load-system 'my-system)

или, при использовании slime, при нажатии ,l my-system RET.


Common Lisp-это базовый язык изображений, хотя обычно в меньшей степени, чем Smalltalk. Это означает, что вы используете библиотеку, загружая ее в изображение, используя загрузить (Если используется явно часто в форме (load (compile-file "your-file-here"))), или обычно с помощью средства определения системы, такого как ASDF. Загруженный код затем доступен для всего кода, скомпилированного / загруженного в будущем.

пакеты действительно являются пространствами имен. Они имеют дело с отображением строк в символы только, они не подключены непосредственно к файлам или функциям или чему-либо еще. Вы получили сообщение об ошибке пакета, так как пытались загрузить файл с помощью пакета перед его определением.