1

中置演算子の使用を許可する次のマクロ ( clojure-koansから) があります。

(defmacro infix-better [form]
  `(~(second form)
    (first form)
    (last form) ))

想定どおりの動作をしますが、正確に同じ式に展開するわけではありません。例えば:

user=> (= '(* 10 2) (macroexpand '(infix-better (10 * 2))))
false
user=> '(* 10 2)                                           
(* 10 2)
user=> (macroexpand '(infix-better (10 * 2))) 
(* (clojure.core/first user/form) (clojure.core/last user/form))

最後の出力は(* 10 2)、内部式が評価されたときになりますが(clojure.core/first user/form)、厳密に言えば、そうではないため、等価テストは false を返します10

展開されたマクロを同等のハードコードされた Clojure と等しくするにはどうすればよいですか?

4

1 に答える 1

2

最初のフォームと同じように、2 番目と 3 番目のフォームの引用符を外す必要があり~ます。すでに評価のチャンスを逃しています。

(defmacro infix-better [form]
  `(~(second form)
    ~(first form)
    ~(last form)))

それを修正してコードの構造を同じに保ちますが、実際には構造を分解すると、はるかに優れた結果が得られます。

(defmacro infix-better [[x op y]]
  (list op x y)) ;; or `(~op ~x ~y)
于 2012-06-03T01:58:26.083 に答える