2013-03-08 3 views
3

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

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

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

Lisp importing/loading file

How to use packages installed by quicklisp?

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

+0

quicklisp более эквивалент менеджера пакетов, как APT-получить в убунту и ASDF является аналогом make- - Различные функциональные возможности. – mcheema

ответ

0

Скачать сл-кто по инструкции на странице quicklisp и запустить это:

#!/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).

+2

Python и Common Lisp имеют разные модели разработки и использования.Common Lisp обычно не используется как пакетный или скриптовый язык, такой как Python; вы обычно запускаете среду, загружаете поддерживающий код и запускаете вызывающие функции. Было бы неплохо, если бы был упрощенный способ создания скриптового типа, но сегодня это не так. – Xach

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) 

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

Это ASDF documentation on how to define systems

После того, как этот файл в месте where ASDF might find it *, предполагая, что у вас установлен ASDF (доступны для вашего Лиспе SBCL поставляется в комплекте с ним), вы бы загрузить эту систему с помощью (asdf:load-system :my-program)Explained here.

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

(push "/path/to/your/system/definition/" asdf:*central-registry*) 
Смежные вопросы