macros - 如何将列表更改为 Clojure 宏中的代码?

标签 macros clojure clojureql

我有以下宏:

(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/

相关文章:

objective-c - NSString 的 stringWithFormat 的简写类似于 NSArrays、NSDictionaries 和 NSNumbers 的 @[]、@{}、@()?

c++ - 如何根据接收到的值获取变量名?

C++ 模板宏快捷方式

clojure 部分说明

orm - 如何使用 ClojureQL 向表添加索引?

Clojureql - 无法获取宏的值(clojure)

c++ - 我可以将 "token pasting operator"与 'const' 模板参数一起使用吗?

clojure 更新向量内的 map 的方法

Clojure 的 defrecord - 如何使用它?

clojureql,开放全局和结果