Wenn Sie die Datei als Ganzes kompilieren, wird sie zuerst als Ganzes gelesen. Zu diesem Zeitpunkt wurde noch keiner davon ausgewertet, daher ist das Paket QT
noch nicht definiert.
Sie können entweder eval-when
verwenden, um etwas zu einem früheren Zeitpunkt auszuwerten, oder eine Systemdefinitionsfunktion verwenden (ASDF ist heutzutage vorherrschend), um Ihr System in der richtigen Reihenfolge zu laden.
Eval-when
:
Beachten Sie, dass Sie in der Regel nicht in der Bibliothek Paketen vertrödeln sollen aber Ihr eigenes, neues Paket definieren Sie den Code halten:
(eval-when (:compile-toplevel :load-toplevel :execute)
(ql:quickload '#:qt))
(defpackage #:qt-example
(:use #:qt))
(in-package #:qt-example)
;; your code here
(Falls Sie sich fragen, , defpackage
, defun
, defclass
usw. sind speziell entworfene Makros, die zu einer Form innerhalb eines solchen eval-when
erweitern.)
Dies ist manchmal in Ordnung für kleine einmalige Skripte. Für Systeme von einer nennenswerten Größe, vor allem, sobald sie mehr als eine Quelldatei haben, verwenden Sie ASDF:
;;;; qt-example.asd
(in-package #:cl-user)
(asdf:defsystem #:qt-experiments
:description "Some experiments with QT."
:serial t
:components ((:file "package")
(:file "qt-example"))
:depends-on (#:qt))
;;;; package.lisp
(defpackage #:qt-example
(:use #:qt))
;;;; qt-example.lisp
(in-package #:qt-example)
ASDF kommt mit den meisten Open-Source-Common Lisp-Implementierungen. Möglicherweise müssen Sie die ASDF-Registrierung einrichten. Ich mag alle meine Projekte vor Ort ein oder zwei Basisverzeichnisse haben, so dass ich nur folgendes in ~/.config/common-lisp/source-registry.conf
setzen können:
(:source-registry
(:tree (:home "devel"))
(:tree (:home "src"))
:inherit-configuration)
Dann ASDF alle Systeme unter diesen Verzeichnissen definiert findet. In SLIME können Sie einfach ,load-system
oder ,open-system
von der REPL mit dem Systemnamen zum Laden verwenden. öffne alle Dateien darin und lade sie optional.
Wenn man aus einer Datei ein einzelnes Toplevel-Formular (mit C-c C-c
) kompiliert, schaut SLIME von dort nach einem in-package
Formular zurück, um herauszufinden, welches Paket es annehmen soll. Normalerweise sollten Sie nur eine einzelne in-package
Form pro Datei an der Spitze haben.
Eine häufig nützliche Abkürzung ist C-c ~
in Lisp-Quelldateien, die die REPL in das Verzeichnis der Datei und das effektive Paket am Punkt schaltet.
Sehr ähnliche Fragen wurden bereits beantwortet. Dies wird nicht das letzte Mal sein. Ich habe ein Tag 'eval-when' hinzugefügt. –