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

StackOverflow https://stackoverflow.com/questions/3818443

  •  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"))) или обычно с системным определением, как Асдф.. Отказ Загруженный код затем доступен для всего кода, собранного / загруженного в будущем.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top