首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将列表更改为Clojure宏中的代码?

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

Stack Overflow用户
提问于 2011-07-07 19:16:39
回答 2查看 163关注 0票数 3

我有以下宏:

代码语言:javascript
复制
(defmacro ss [x]

`(clojureql.core/select 
      (clojureql.core/table db "users_table")
      (clojureql.core/where  ~x)
  )
)

(macroexpand '(ss '(= :type "special")))

*但它产生了:

代码语言:javascript
复制
(clojureql.core/select (clojureql.core/table oe.db.dbcore/db "users_table") (clojureql.core/where '(= :type "special"))) 

*而不是:

代码语言:javascript
复制
(clojureql.core/select (clojureql.core/table oe.db.dbcore/db "users_table") (clojureql.core/where (= :type "special"))) 

::我意识到问题是我正在传递一个列表'(=:类型“特殊”),但是我如何才能在宏中取消引用呢?

更新:

由于Mikera的回答,我终于做到了这一点:

代码语言:javascript
复制
(defn ss [x]

  (clojureql.core/select 
      (clojureql.core/table db "users_table")
      x
  )


)

(macroexpand '(ss (eval `(clojureql.core/where ~'(= :type "special")))))

*虽然产出略有不同,但效果如预期:

代码语言:javascript
复制
(ss (eval (clojure.core/seq (clojure.core/concat (clojure.core/list 'clojureql.core/where) (clojure.core/list '(= :type "special")))))) 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-07 19:40:02

在我看来,您将错误的东西传递给宏展开:您可能应该使用:

代码语言:javascript
复制
(macroexpand '(ss (= :type "special")))

也就是说,你需要在开头引用一句话来引用整个表达式。

票数 3
EN

Stack Overflow用户

发布于 2011-07-08 07:24:53

您不能将运行时参数传递给宏,因为前者只在-好运行时才知道,而后者已经在编译时展开和编译。

你必须使用一个函数。

代码语言:javascript
复制
(defn get-users-by-type
  [t]
  (cql/select
    (cql/table db "users_table")
    (cql/where (= :type t))))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6615854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档