我正在定义此 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"})