2009-07-06 5 views
5

の使用に別の式で評価される「必要」する必要があります。なぜ私はいくつかのlispの初期化コード持っているパッケージ

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

:このバージョンながら、

(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*)) 

なぜそのバージョンがコンパイルんが3行目のコンパイルファイル中にエラーが発生し、認識できないパッケージがあります。

私はcclを使用していますが、(require 'asdf)は組み込みバージョンのASDFを持ってきていると文書化されています。

答えて

9

以下は、いくつかの詳細では不正確かもしれないが、それはこのように、およそ次のとおりです。

Lispの「エンジン」が経由する4つのフェーズがあります、時間、マクロ展開の時間を読んで時間をコンパイルし、実行時間。

各最上位フォームが最初に完全に読み込まれます。しかしながら、読書はそれぞれの記号の解決を含む。 eval-whenフォームの読み取り時間中にASDFがまだロードされていないため、asdf:*central-registry*というシンボルはまだ解決できません。このため、前述の読み取りエラーが発生します。

4

回答を参照してください。

場合によってはこれを回避することができます。次に、RUNTIMEでコード内のシンボルを参照する必要があります。上記のコード

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

シンボル空自ので、使用することができます:*中央レジストリ*直接使用するが、シンボル名とパッケージ名を使用して、実行時に見上げていません。

関連する問題