【发布时间】:2013-05-08 15:35:10
【问题描述】:
我想出了下面的函数,它按预期工作,但它使用了 eval,这很可怕,并且在我打算使用它的 ClojureScript 中不存在。
(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 ...))
-
您的宏将取决于它的使用情况,d 和 p 值是在编译时可用还是在运行时可用?
标签: macros clojure eval clojurescript