2009-07-06 13 views
5

我有些口齒不清初始化代碼:爲什麼必須「要求」在一個單獨的公式進行計算使用包

(eval-when (:compile-toplevel :load-toplevel :execute) 
    (require 'asdf)) 

(eval-when (:compile-toplevel :load-toplevel :execute) 
    (push #p"c\:\\lisp\\clsql-4.0.4\\" asdf:*central-registry*)) 

爲什麼該版本的編譯,而這個版本:

(eval-when (:compile-toplevel :load-toplevel :execute) 
    (require 'asdf) 
    (push #p"c\:\\lisp\\clsql-4.0.4\\" asdf:*central-registry*)) 

在第三行的編譯文件中產生一個錯誤,asdf是一個無法識別的包?

我正在使用ccl,並且(需要'asdf)被記錄爲引入ASDF的內置版本。

回答

9

下可能在某些細節不準確的,但它是大約是這樣的:

有四個階段的Lis​​p的「發動機」經歷:讀的時候,宏展開時,編譯時間和運行時間。

首先完整讀入每個頂層表單。然而,閱讀涉及解決相應的符號。由於ASDF在您的eval-when表單的讀取期間尚未加載,因此符號asdf:*central-registry*仍無法解析,並且會產生上述讀取錯誤。

4

請參閱由斯萬特的答案。

有時你可能想要解決這個問題。然後你需要在RUNTIME的代碼中查找符號。

(push somepath (symbol-value (find-symbol "*CENTRAL-REGISTRY*" "ASDF"))) 

上面的代碼可以被使用,因爲符號ASDF:*中央登記*不能直接使用,但使用的符號名和包名擡頭看着運行。

相關問題