我有以下宏:
(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")))
:我意识到问题是我传入了一个列表 '(= :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"))))))
最佳答案
在我看来,您向宏扩展传递了错误的内容:您可能应该使用:
(macroexpand '(ss (= :type "special")))
即您只需要在开头引用一个引号即可引用整个表达式。
关于macros - 如何将列表更改为 Clojure 宏中的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6615854/