Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Clojure包裹_Clojure_Macros - Fatal编程技术网

用Clojure包裹

用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 ) 如果尝

有时我很难在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))
(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作为第一个参数。此外,您还可以使用`查找'函数来隐藏monger
find
函数。也许你应该这样做:

(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))