Как сделать и использовать библиотеку с Lisp (CLISP)?
-
26-09-2019 - |
Вопрос
В C / C ++ я могу сделать библиотеку и сделать его статическим или DLL, используя #inClude "" в исходном коде и -labc при ссылке. Как у меня такая же функция в Лисске?
В качестве примера UTIL.LIPP в каталоге A. Я определяю функцию библиотеки Hello.
(Defackage "Util" (: использование «Common-Lisp») (: NickNames «UT») (: экспорт «Hello»)) (в пакете UTIL) (DEFUN HELLO () (формат T »Hello, World"))
И попробуйте использовать эту функцию библиотеки от основной функции.
(Defun Main () (UT: Hello)) (Главная)
Я старался
Cleisp Main.Lisp A / UTIL.LISP
Но я получил следующее сообщение
*** - Читать с #: Там нет пакета с именем "ut"
- Какой эквивалент #include "" использовать библиотеку?
- Что такое эквивалент -lutil для загрузки библиотеки? Какая командная строка для CleisP / SBCL для использования библиотеки?
- А для Defpackage это эквивалентно пространству имен?
ДОБАВЛЕН
Мне просто пришлось загрузить библиотеку.
(нагрузка »./a/util.lisp") (Defun Main () (UT: Hello)) (Главная)
И запустить «Cleisp Main.lisp» работает нормально.
Решение
Вы должны загрузить util.lisp перед main.lisp:
> (load "util.lisp")
> (load "main.lisp")
> (main)
hello, world
NIL
Практический общий Lisp имеет Хорошее введение в определение и использование пакетов.
Другие советы
Что вы ищете, называются система. Отказ Обычный Лисс defpackage
Не имеет ничего общего с этим, и да, это о пространствах имен. Посмотреть на Гиперспец, или Руководство идиот (См. Комментарий Xach ниже), чтобы узнать больше об этом.
Вы можете ограничить себя просто загружать файлы, но обычно используются объект определения системы; в основном Асдф. Настоящее время. Минимальный пример:
(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 будет содержать определение пакета, вещи и 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
.
Common Lisp - это базовый язык изображения, хотя обычно в меньшей степени, чем SoldTalk. Это означает, что вы используете библиотеку, загрузив ее на изображение, используя НАГРУЗКА (если используется явно часто в форме (load (compile-file "your-file-here"))
) или обычно с системным определением, как Асдф.. Отказ Загруженный код затем доступен для всего кода, собранного / загруженного в будущем.
Пакеты действительно пространства имен. Они имеют дело со сопоставлением струн на символы Только, они не подключены непосредственно к файлам или функциям или что-то еще. Вы получили ошибку пакета, потому что вы попытались загрузить файл с помощью пакета перед файлом, определяющим его.