使用过滤器使用过滤器的宏宏返回对象引用.不知道如何解释此参考



我正在定义此 macro

seminar.core=> (defmacro select
          #_=>     [vara _ coll _ wherearg _ orderarg]
          #_=>        `(filter ~wherearg))
#'seminar.core/select

,然后定义表

(def persons '({:id 1 :name "olle"} {:id 2 :name "anna"} {:id 3 :name 
"isak"} {:id 4 :name "beatrice"}))

当我尝试运行我的macro时,以便从表格大于2(即{:id 3 :name "isak"} {:id 4 :name "beatrice"}

的表中获取列
    seminar.core=> (select [:id :name] from persons where [> :id 2] orderby :name)

我会收到以下消息,并且不知道如何解释

#object[clojure.core$filter$fn__4808 0x18e53c53 "clojure.core$filter$fn__4808@18e53c53"]

更新

我添加了第二个参数

seminar.core=> (defmacro select
          #_=>     [vara _ coll _ wherearg _ orderarg]
          #_=>        `(filter ~wherearg ~coll))

现在接收IllegalArgumentException Key must be integer clojure.lang.APersistentVector.invoke (APersistentVector.java:292)作为我的返回值。我不知道如何解释此错误

当您使用macroexpand-1函数查看宏的扩展形式时,它可能会给您一个线索:

(macroexpand-1 '(select [:id :name] from persons where (> :id 2) orderby :name))
;;=> (clojure.core/filter [> :id 2] persons)

表格[> :id 2]不是Clojure中的有效函数定义。您必须将适当的功能传递给filter,例如使用匿名函数:

(select [:id :name] from persons where #(> (:id %) 2) orderby :name)
;;=> ({:id 3, :name "isak"} {:id 4, :name "beatrice"})

最新更新