我無法讓clojure defmacro做我想做的事。我已將我的實際代碼縮減爲以下代碼段。clojure宏變量與地圖的麻煩
這創造了一些東西關閉到我想要的。我試圖有條件地插入(第一個p#)或(第二個p#),具體取決於傳遞給宏的參數。
(defmacro mmz1 [t]
`(map (fn [p#] (let [t1# (first p#)
t2# ~(if t `(first p#) `(second p#))]
(* t1# t2#)))
[ [1 2] [3 4] ]))
(macroexpand-1 '(mmz1 false))
顯示
(map
(fn [p__18341__auto__]
(let [t1__18342__auto__ (first p__18341__auto__)
t2__18343__auto__ (second p__18340__auto__)]
(* t1__18342__auto__ t2__18343__auto__)))
[[1 2] [3 4]])
但是,請注意,這種形式的變量(第二P_ _auto_ )不匹配匿名函數參數p _18341_ 汽車 _。所以,執行代碼會導致錯誤,因爲第二個var沒有定義。我怎樣才能讓這些變量匹配?這是我想要完成的。
出於測試目的,該代碼完成我想要的,但我不想在那臺T2#產生的宏代碼(如果)的形式。一個宏應該讓我做到這一點 - 不是嗎?
(defmacro mmz0 [t]
`(map (fn [p#] (let [t1# (first p#)
t2# (if ~t (first p#) (second p#))]
(* t1# t2#)))
[ [1 2] [3 4] ]))
(macroexpand-1 '(mmz0 false))
顯示
(map
(fn [p__18387__auto__]
(let [t1__18388__auto__ (first p__18387__auto__)
t2__18389__auto__ (if false
(first p__18387__auto__)
(second p__18387__auto__))]
(* t1__18388__auto__ t2__18389__auto__)))
[[1 2] [3 4]])
和代碼的輸出是預期:
(mmz0 false) -> (2 12)
如果你想要解決這個問題的背景,我在Overtone論壇的這個查詢中解釋了它(有點)。 https://groups.google.com/forum/?fromgroups=#!topic/overtone/CScDTtzteRk –