用Clojure包裹
有时我很难在Clojure中包装函数或宏 例如,提供了一个DSL来查询集合:,它是一个宏 使用它的一种方法如下所示:用Clojure包裹,clojure,macros,Clojure,Macros,有时我很难在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 ) 如果尝
(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))
(find (quote sort (array-map :score -1 :name 1)))
我猜这是因为正在对sort求值,而集合需要一个函数
如果尝试引用,则会出现以下错误:ClassCastException clojure.lang.PersistentList无法强制转换为clojure.lang.IFn
(find (sort (array-map :score -1 :name 1))
(find (quote sort (array-map :score -1 :name 1)))
如果尝试传递匿名函数,则会出现以下错误:ArityException传递给的参数数错误(1):main/eval139628/fn--139629
是否可以使用函数包装这种宏?谢谢。问题是带有集合的
宏扩展为->
,因此您的函数应该将coll作为第一个参数。此外,您还可以使用`查找'函数来隐藏mongerfind
函数。也许你应该这样做:
(defn my-find [sort]
(with-collection my-db my-coll
(find {})
sort)
(my-find #(sort % (array-map :score -1 :name 1))
这样称呼它:
(defn my-find [sort]
(with-collection my-db my-coll
(find {})
sort)
(my-find #(sort % (array-map :score -1 :name 1))
匿名函数不接受任何参数。尝试#(排序%(数组映射:score-1:name 1))