我已經想出了下面的函數,它按照預期工作,但是它使用了eval,這很可怕,並且在我打算使用它的ClojureScript中不存在。如何使用defmacro而不是eval?
(defn path [d p]
(eval
(concat '[-> d]
(flatten (map
#(conj (repeat (dec %) 'z/right) 'z/down)
(path-to-vector p))))))
如何將它轉換爲宏?我的嘗試是這樣的:
(defmacro path [d p]
`(concat (-> ~d)
(flatten
(map #(conj (repeat (dec %) z/right) z/down)
(path-to-vector ~p)))))
但這顯然不起作用。
首先,不需要在語法引用中使用concat。你的宏可能看起來像這樣:'( - > d〜@(flatten ...)) – Alex 2013-05-08 16:09:14
你的宏將取決於它的用法,是編譯時可用的d和p值還是運行時的東西? – Ankur 2013-05-08 16:24:39