Пример использования внешних библиотек или пакетов в Common Lisp

В Common Lisp quicklisp - это популярный инструмент управления библиотеками. Я собираюсь использовать этот инструмент, и я собираюсь попробовать использовать CL-WHO. Я использую реализацию SBCL 1.0.57. Я собираюсь ответить на свой вопрос ниже.

Как новичок, не ясно, как ASDF и quicklisp на самом деле работают вместе. И поэтому не ясно, как на самом деле использовать пакеты или библиотеки, которые вы скачали через quicklisp во внешнем исходном файле. FAQ по QuickLisp, по крайней мере, на данный момент, не помогает. В python это невероятно просто: вы можете просто вставить 'import somemodule' и жизнь прекрасна. Есть ли эквивалент для CL+quicklisp?

Если вы ищете, вы найдете много результатов. Вот некоторые из наиболее важных, которые я нашел:

Lisp импорт / загрузка файла

Как использовать пакеты, установленные quicklisp?

Когда я читал их изначально, мне в голову пришёл, по крайней мере, один вопрос: должен ли я на самом деле заботиться о ASDF, если я использую quicklisp? Quicklisp, кажется, инструмент управления более высокого уровня. Другие люди предлагают использовать quickproject. Но действительно ли это необходимо?

2 ответа

Аналогия с импортом в Python - это определение системы... ну, это очень грубая аналогия, но это путь. Вы объявляете зависимости в определении системы, а затем в исходном коде ожидаете, что она будет там, так что если вы позже обратитесь к битам стороннего кода, вы просто сделаете это.

Например. в определении системы вы можете иметь: (обычно это будет в my-program.asd файл)

(defsystem :my-program
  :version "0.0.1"
  :serial t
  :description "My program"
  :components ((:file "some-source-file"))
  ;; `some-external-package' here is the "import", i.e. here you
  ;; declared that you will be using code from this package.
  ;; ASDF will generally "know" how to get the code of that package
  ;; from here on. But if it doesn't, then there are ways to "help it"
  ;; similar to how in Python there's a procedure to prepare your local
  ;; files to be used by easy_install
  :depends-on (:some-external-package))

Позже в вашем коде вы просто предполагаете, что some-external-package доступно для вашей программы, например:

(some-external-package:exported-symbol)

должен просто работать. ("Ваш код" - это файл some-source-file.lisp, который вы указали в компонентах).

Это документация ASDF о том, как определять системы

После того, как у вас есть этот файл в том месте, где ASDF может его найти *, при условии, что у вас установлен ASDF (доступен для вашего Lisp, SBCL поставляется вместе с ним), вы загрузите эту систему, используя (asdf:load-system :my-program) Объяснил здесь.

* - быстрый способ проверить это было бы сделать

(push "/path/to/your/system/definition/" asdf:*central-registry*)

Скачайте cl-who, следуя инструкциям на странице быстрого списка, и запустите это:

#!/usr/bin/sbcl --script

(load "~/quicklisp/setup.lisp")
(ql:quickload "asdf")
(asdf:load-system 'cl-who)

(with-open-file (*standard-output* "out.html" :direction :output)
                (cl-who:with-html-output (*standard-output* nil :indent t)
                                  (:html
                                   (:head
                                    (:title "Test page"))
                                   (:body
                                    (:p "CL-WHO is really easy to use")))))

Для новичка или для кого-то, кто действительно ленив, нет причины, почему вы должны написать 3 строки вверху вместо одной (как в python).

Другие вопросы по тегам