使用过滤器的Clojure宏返回一个对象引用。 不知道如何解释这个参考(Clojure Macr

2019-09-25 19:22发布

我定义这个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 ,让我从表中的列其中ID大于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)作为我的返回值了。 我不知道如何解释这个错误

Answer 1:

当您使用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"})


文章来源: Clojure Macro using filter returns an object reference. Do not know how to interpret this reference