Как использовать пакеты, установленные quicklisp?
Я установил пакет CL-PNG с помощью quicklisp.
(ql:quicklisp 'png)
Теперь я хочу определить свой собственный пакет, который зависит от пакета CL-PNG. Вот так:
(defpackage :FOO
(:use :CL :PNG)
(:export :BAR))
При компиляции я получаю эту ошибку:
The name "PNG" does not designate any package.
[Condition of type SB-KERNEL:SIMPLE-PACKAGE-ERROR]
Кажется, мне нужно позвонить (require :PNG)
на REPL перед компиляцией моего пакета.
Что мне нужно сделать, чтобы пакет CL-PNG был доступен для компилятора без вызова вручную require
на REPL?
ОБНОВЛЕНИЕ: я использую SBCL.
1 ответ
Вы путаете два отдельных понятия: system
и package
, package
определяется стандартом Common Lisp и представляет собой набор символов, способ контролировать их видимость и использование. system
не определяется стандартом, это понятие введено ASDF
, который представляет собой набор метаданных для управления взаимозависимостями файлов в одном проекте, чтобы иметь возможность правильно скомпилировать и загрузить его. Quicklisp
построен на вершине ASDF
предоставить способ распространения проектов, описанных в виде ASDF system
s.
Так что при установке (quickload
) system
, называется PNG
, это не значит, что эта система имеет пакет, называемый PNG
, Определяет ли система какие-либо пакеты (обычно она определяет один или даже несколько из них) и как они называются, остается на усмотрение ее автора. Большинство проектов будут иметь package.lisp
или же packages.lisp
файлы, где их package
с определены.
Но в случае CL-PNG
система, которую вы загружаете, она фактически определяет пакет PNG
и он должен быть доступен в рабочем процессе после того, как вы quickload
Это. Но вы должны каким-то образом загружать его каждый раз, когда запускаете свою систему Lisp. ASDF
предоставляет средства для определения зависимости от CL-PNG
система, так что вы можете просто загрузить только свой собственный system
и все system
s зависит от того, будет ли загружаться автоматически, делая доступными все package
вы хотите использовать.