ファイル全体をコンパイルすると、最初に全体が読み取られます。その時点ではまだ評価されていないため、パッケージQT
はまだ定義されていません。
を使用eval-when
して何かを早い段階で評価するか、システム定義機能 (現在は ASDF が主流) を使用してシステムを正しい順序でロードすることができます。
Eval-when
:
(eval-when (:compile-toplevel :load-toplevel :execute)
(ql:quickload '#:qt))
(in-package #:qt)
通常、ライブラリ パッケージをいじくり回すのではなく、コードを保持する独自の新しいパッケージを定義する必要があることに注意してください。
(eval-when (:compile-toplevel :load-toplevel :execute)
(ql:quickload '#:qt))
(defpackage #:qt-example
(:use #:qt))
(in-package #:qt-example)
;; your code here
(ご参考までにdefpackage
、defun
、defclass
などは、そのような 内のフォームに展開される特別に設計されたマクロですeval-when
。)
これは、小さな 1 回限りのスクリプトでは問題ない場合があります。注目に値するサイズのシステムの場合、特に複数のソース ファイルがある場合は、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 には、ほとんどのオープンソース Common Lisp 実装が付属しています。ASDF レジストリの設定が必要になる場合があります。すべてのローカル プロジェクトに 1 つまたは 2 つのベース ディレクトリを用意したいので、以下を .xml に入れるだけ~/.config/common-lisp/source-registry.conf
です。
(:source-registry
(:tree (:home "devel"))
(:tree (:home "src"))
:inherit-configuration)
次に、ASDF はそれらのディレクトリの下に定義されているすべてのシステムを見つけます。SLIME では、,load-system
または,open-system
システム名を指定した REPL を使用して、resp をロードすることができます。その中のすべてのファイルを開き、必要に応じてロードします。
ファイルから( を使用して) 単一のトップレベル フォームをコンパイルする場合C-c C-c
、SLIME はそこから逆方向in-package
に検索してフォームが想定するパッケージを見つけます。通常、in-package
ファイルごとに 1 つのフォームのみをその上部に配置する必要があります。
一般的に便利なショートカットはC-c ~
Lispソースファイルにあります。これは、REPLをファイルのディレクトリと有効なパッケージに切り替えます。