作爲一個整體編譯文件時,首先將它作爲一個整體進行閱讀。那時,它還沒有被評估過,所以包QT
尚未定義。
您可以使用eval-when
來評估早些時候的事情,或者使用系統定義工具(ASDF現在占主導地位)以正確的順序加載您的系統。
Eval-when
:
請注意,您通常不應該淤泥周圍庫包,但是可以定義你自己的,新鮮的包扶代碼:
(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
內的形式。)
這對於一次性小腳本有時可以使用。對於特別是當他們有一個以上的源文件中的任何值得注意的大小的系統,使用航空自衛隊:
;;;; 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)
航空自衛隊配備了許多開源的Common Lisp實現。您可能需要設置ASDF註冊表。我喜歡有我所有的地方項目的一個或兩個基本的目錄,這樣我就可以把下列~/.config/common-lisp/source-registry.conf
:
(:source-registry
(:tree (:home "devel"))
(:tree (:home "src"))
:inherit-configuration)
然後ASDF發現下面這些目錄中定義的所有系統。在SLIME中,您可以使用系統名稱REPL中的,load-system
或,open-system
加載它,打開它中的所有文件,可選擇加載它。
當從文件編譯單個頂層表單(使用C-c C-c
)時,SLIME從那裏查找in-package
表單以找出它應該採用的包。通常,每個文件的頂部只應有一個in-package
表單。
在Lisp源文件中,一個常用的快捷方式是C-c ~
,它將REPL切換到文件的目錄和點的有效包。
已經回答了非常類似的問題。這不會是最後一次。我已經添加了一個標籤'eval-when'。 – 2014-11-23 23:58:58