我有以下宏:
(defmacro ss [x]
`(clojureql.core/select
(clojureql.core/table db "users_table")
(clojureql.core/where ~x)
)
)
(macroexpand '(ss '(= :type "special")))*但它产生了:
(clojureql.core/select (clojureql.core/table oe.db.dbcore/db "users_table") (clojureql.core/where '(= :type "special"))) *而不是:
(clojureql.core/select (clojureql.core/table oe.db.dbcore/db "users_table") (clojureql.core/where (= :type "special"))) ::我意识到问题是我正在传递一个列表'(=:类型“特殊”),但是我如何才能在宏中取消引用呢?
更新:
由于Mikera的回答,我终于做到了这一点:
(defn ss [x]
(clojureql.core/select
(clojureql.core/table db "users_table")
x
)
)
(macroexpand '(ss (eval `(clojureql.core/where ~'(= :type "special")))))*虽然产出略有不同,但效果如预期:
(ss (eval (clojure.core/seq (clojure.core/concat (clojure.core/list 'clojureql.core/where) (clojure.core/list '(= :type "special")))))) 发布于 2011-07-07 19:40:02
在我看来,您将错误的东西传递给宏展开:您可能应该使用:
(macroexpand '(ss (= :type "special")))也就是说,你需要在开头引用一句话来引用整个表达式。
发布于 2011-07-08 07:24:53
您不能将运行时参数传递给宏,因为前者只在-好运行时才知道,而后者已经在编译时展开和编译。
你必须使用一个函数。
(defn get-users-by-type
[t]
(cql/select
(cql/table db "users_table")
(cql/where (= :type t))))https://stackoverflow.com/questions/6615854
复制相似问题