首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Clojure包装

用Clojure包装
EN

Stack Overflow用户
提问于 2015-10-19 18:46:39
回答 1查看 401关注 0票数 3

有时,我很难将函数或宏包装在Clojure中。

例如,克洛尔蒙戈提供了一个DSL来查询集合:与-收集,这是一个宏。

使用它的一个方法如下所示:

代码语言:javascript
复制
(with-collection db coll
    (find {})
    (sort (array-map :score -1 :name 1)))

我想创建一个接收排序函数并调用的函数。

代码语言:javascript
复制
(defn find [sort]
    (with-collection my-db my-coll
       (find {})
       sort
)

如果我试图调用该函数,则会得到以下错误:无法将ClassCastException clojure.lang.PersistentList转换为clojure.lang.IFn

代码语言:javascript
复制
(find (sort (array-map :score -1 :name 1))

我想这是因为排序正在被评估,而使用-collection需要一个函数。

如果我试图引用以下错误:不能将ClassCastException clojure.lang.PersistentList转换为clojure.lang.IFn

代码语言:javascript
复制
(find (quote sort (array-map :score -1 :name 1)))

如果我试图传递一个匿名函数,我会得到以下错误: ArityException错误数量的args (1)传递给:main/val139628/fn-139629

代码语言:javascript
复制
(find #(sort (array-map :score -1 :name 1))

可以用函数包装这种宏吗?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-19 19:45:34

问题是,with-collection宏扩展为一个->,因此您的函数应该将coll作为第一个参数。此外,您还可以用“查找”函数来隐藏monger find函数。也许你应该这样做:

代码语言:javascript
复制
(defn my-find [sort]
  (with-collection my-db my-coll
    (find {})
    sort)

就这样叫它:

代码语言:javascript
复制
(my-find #(sort % (array-map :score -1 :name 1))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33221679

复制
相关文章

相似问题

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