我有兩個宏。第一個將符號作爲唯一參數(因爲它傳遞給def,需要一個符號)。第二個函數帶有一個符號列表,並且應該分別爲每個符號調用第一個符號。在clojure中,我如何從另一個宏評估宏的參數?
(defmacro m1 [s]
'(let [f# ... dynamic function definition ...]
(def ~s f#))
第二個宏應該取一個符號列表並將它們傳遞給第一個,但我無法讓它工作。我能想出的最好的是以下幾點:
(defmacro m2 [symbols]
`(for [s# ~symbols] (eval (read-string (str "(name.of.current.namespace/m1 " s# ")")))))
迫使s#
它被傳遞給第一宏之前進行評估。它也被調用一個字符串列表,而不是一個符號列表。
這對我使用的庫很有用,庫中的所有功能都採用相同的兩個第一個參數。我試圖在我的命名空間中爲一些函數創建包裝函數,這些函數自動提供前兩個參數值,這些參數值對所有這些參數都是通用的。
任何想法,以改善這一點?
爲什麼一個普通的FN是不是一種選擇嗎? '(defn m2fun [symbols](map m1 symbols))' – skuro 2011-03-10 13:43:02
你可以使用部分嗎?我真的不明白問題所在。 – nickik 2011-03-10 15:10:02