*file*
はがをコンパイルされたファイルのパスに設定されているので、あなたの全体のプログラムの後、*file*
の値(evalの一切の使用を想定していない)を見て、もはや有益であるコンパイルされません。
test.clj
の例では、ファイルがまだコンパイルされている間にprintln
が実行されます。 *file*
への参照をテストまたは関数に移動すると、*file*
の値が役に立たなくなった後で実行時に逆参照されます。
拡張されたときに値*file*
を格納するマクロを記述すると、その結果を後で使用できるようになります。たとえば、ファイルexample.clj
を持つことができ:次に
(defmacro source-file []
*file*)
(defn foo [x]
(println "Foo was defined in" (source-file) "and called with" x))
REPLからか、どこかに、は印刷になります。場合にのみ、で定義されているファイルsource-file
関係ないことを
Foo was defined in /home/chouser/example.clj and called with 42
注意を展開されたファイルは、foo
が定義されているファイルです。これは、foo
がコンパイルされ、source-file
が実行され、source-file
という戻り値が文字列であるため、foo
のコンパイル済みバージョンに含まれているためです。文字列はもちろん、foo
が実行されるたびに利用可能です。
この動作が驚くべき場合は、*file*
が実行時にすべての関数の中で有効な値を持つために何が起こるのかを検討すると役立ちます。その値は、ほとんどの場合、ほとんど使用されない機能の実行時のオーバーヘッドになるよう、関数呼び出しおよび戻りごとに変更する必要があります。
大きな説明;どうもありがとう! –