以下は、で作成された単純な Clojure アプリの例ですlein new mw。
(ns mw.core
(:gen-class))
(def fs (atom {}))
(defmacro op []
(swap! fs assoc :macro-f "somevalue"))
(op)
(defn -main [& args]
(println @fs))
そしてproject.clj私は持っています
:profiles {:uberjar {:aot [mw.core]}}
:main mw.core
REPL で実行すると、評価は を@fs返します{:macro-f somevalue}。しかし、uberjar を実行すると{}. op定義をdefnの代わりにdefmacroに変更fsすると、uberjar から実行したときに再び適切なコンテンツになります。何故ですか?
これが AOT コンパイルと関係があり、マクロ展開がコンパイル フェーズの前に発生するという事実に漠然と気づいていますが、明らかにこれらのことについての私の理解が不足しています。
mixfix オペレーターがグローバル アトムを使用して定義されている、非常に優れたmixfixライブラリを使用するアプリケーションをデプロイしようとしているときに、この問題に遭遇しました。問題を上記の例に切り分けるのにかなりの時間がかかりました。
どんな助けでも大歓迎です。
ありがとう!