Как сделать и использовать библиотеку с помощью lisp (clisp)? - PullRequest
9 голосов
/ 29 сентября 2010

В 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.lisp' работает нормально.

Ответы [ 3 ]

5 голосов
/ 29 сентября 2010

То, что вы ищете, называется системы .Common Lisp's 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")))

Где 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.

4 голосов
/ 29 сентября 2010

Вы должны загрузить util.lisp до main.lisp:

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

Практический Common Lisp содержит хорошее введение в определение и использование пакетов .

1 голос
/ 29 сентября 2010

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

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

...