4

以下は、で作成された単純な 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ライブラリを使用するアプリケーションをデプロイしようとしているときに、この問題に遭遇しました。問題を上記の例に切り分けるのにかなりの時間がかかりました。

どんな助けでも大歓迎です。

ありがとう!

4

2 に答える 2