有时,我很难将函数或宏包装在Clojure中。
例如,克洛尔蒙戈提供了一个DSL来查询集合:与-收集,这是一个宏。
使用它的一个方法如下所示:
(with-collection db coll
(find {})
(sort (array-map :score -1 :name 1)))我想创建一个接收排序函数并调用的函数。
(defn find [sort]
(with-collection my-db my-coll
(find {})
sort
)如果我试图调用该函数,则会得到以下错误:无法将ClassCastException clojure.lang.PersistentList转换为clojure.lang.IFn
(find (sort (array-map :score -1 :name 1))我想这是因为排序正在被评估,而使用-collection需要一个函数。
如果我试图引用以下错误:不能将ClassCastException clojure.lang.PersistentList转换为clojure.lang.IFn
(find (quote sort (array-map :score -1 :name 1)))如果我试图传递一个匿名函数,我会得到以下错误: ArityException错误数量的args (1)传递给:main/val139628/fn-139629
(find #(sort (array-map :score -1 :name 1))可以用函数包装这种宏吗?谢谢。
发布于 2015-10-19 19:45:34
问题是,with-collection宏扩展为一个->,因此您的函数应该将coll作为第一个参数。此外,您还可以用“查找”函数来隐藏monger find函数。也许你应该这样做:
(defn my-find [sort]
(with-collection my-db my-coll
(find {})
sort)就这样叫它:
(my-find #(sort % (array-map :score -1 :name 1))https://stackoverflow.com/questions/33221679
复制相似问题