2012-06-03 38 views
1

我有這個宏(從clojure-koans)應該允許使用中綴操作符:平等斷言失敗的macroexpand

(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?

回答

2

您必須取消第二個和第三個表單,就像您第一個表單一樣,~ - 「當內部表達式被評估時,最後的輸出結果爲(* 10 2)」不是任何方式 - 內在的表達已經讓他們有機會被評估。

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

會修,並保持你的代碼結構是相同的,但真正解構爲您提供了一個更加美好的結果:

(defmacro infix-better [[x op y]] 
    (list op x y)) ;; or `(~op ~x ~y)