首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Korma中构建where条件时宏不能工作的原因

在Korma中构建where条件时宏不能工作的原因
EN

Stack Overflow用户
提问于 2013-06-16 17:14:52
回答 1查看 155关注 0票数 4

我试图动态地向Korma查询添加WHERE条件

代码语言:javascript
运行
复制
(-> the-query
    (where {:archived false})
    (add-where-conditions params)
    (limit 200)
    (select))

我试图动态地构建对korma's where函数的调用。这个电话看起来有点像(where query (or (between :freq [100 200]) (between :freq [300 400]) ... ))。助手函数make-conds列出where函数的参数列表,如:(or (between :freq [100 200]) ...

我尝试了以下方法来构建动态where调用。只有第一个,使用eval的那个工作。为什么?有更好的方法吗?

代码语言:javascript
运行
复制
(defn add-where-conditions [query params]
  (eval (list 'where query (make-conds params))))

(defmacro add-where-conditions-2 [query params]
  (list 'where query (make-conds params))) ; broken

(defmacro add-where-conditions-3 [query params]
  `(where ~query ~(make-conds params))) ; broken

免责声明:我是Clojure和Korma的新手

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-17 20:22:11

宏不能工作的原因是,在这两种情况下,params参数的值都是符号params。这就是为什么在add-where-conditions-2add-where-conditions-3中,当宏进行(make-conds params)调用时,函数接收的值不是您正在考虑的列表,而是符号params,在以下代码行中显示了一个错误:

代码语言:javascript
运行
复制
IllegalArgumentException Don't know how to create ISeq from: clojure.lang.Symbol  clojure.lang.RT.seqFrom (RT.java:505)

第一种情况之所以有效,是因为函数接收列表(而不是符号)作为params参数的值,因此eval接收列表(where {:your-query nil} (or (between :freq [100 200]) ,,,)),这是where宏所期望的,并且知道如何处理。

where宏解析表达式,以搜索用于构建表达式的一些谓词。where*,函数替代,没有这种功能,所以我想不出一个替代eval吃蛋糕和拥有它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17135794

复制
相关文章

相似问题

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