この質問は純粋に「精神的なマスターベーション」から来ており、おそらく実用的な価値はありません。
を使用してClojureで値を定義した場合def
、コンパイラーはコンパイル時に値を評価し、実行時まで待たないように誘導できますか?
(def the-answer 42)
(+ the-answer 1)
マクロを定義できると思いますが、呼び出し構文は少し厄介になります。
(defmacro the-answer [] 42)
(+ (the-answer) 1)
これも機能しますが、それでも醜いです:
(+ `~the-answer 1)
また、Clojureがコンパイル時に定数式を評価することも理解しています(または信じています)。
(def milliseconds-per-day (* 24 60 60 1000))
私はCommonLispを学んでいますが、Common Lispはユーザー定義のリーダーマクロをサポートしているので#$
、コンパイル時に次のシンボルを評価するリーダーマクロ(のようなもの)を定義できます。
(+ #$the-answer 1)
ちなみに、その構文はマクロ呼び出しよりも「きれい」ではありません。
Clojureにコンパイル時に定数変数を評価させ、参照を実際の値に置き換えるにはどうすればよいですか?すでにそうしていますか?
誰かがクヌースの法則(「時期尚早の最適化はすべての悪の根源である」)を引用し始める前に、Clojureコンパイルの内部をよりよく理解するためにこの質問をします。