Как сделать и использовать библиотеку с 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. Загруженный код затем доступен для всего кода, скомпилированного / загруженного в будущем.
пакеты действительно являются пространствами имен. Они имеют дело с отображением строк в символы только, они не подключены непосредственно к файлам или функциям или чему-либо еще. Вы получили сообщение об ошибке пакета, так как пытались загрузить файл с помощью пакета перед его определением.