我是Clojure的新手,并创建了一个简单的宏来调用Java类上的某些方法并将结果返回到Clojure映射中,这一切都运行正常。 (我也知道bean
函数,但我使用的类不是bean。
我的问题是关于调用代码。将Java'方法'作为符号传递是更好的形式吗?
我现在还不确定.toString
目前的类型(在调用代码中)?这一切都有效,但不确定其惯用的Clojure。
(defmacro obj-to-map
[obj & body]
(let [afn (fn [[method kw]]
`(~kw (~method ~obj)))]
`(assoc {} ~@(mapcat afn (partition 2 body)))))
(obj-to-map "hello" .length :length .toString :value)
=> {:value "hello", :length 5}
答案 0 :(得分:2)
.toString
等是调用代码中的符号。
我认为传递方法名称并使用“。”调用它会更好。
(defmacro obj-to-map
[obj & body]
(let [afn (fn [[method kw]]
`(~kw (. ~obj ~method)))]
`(assoc {} ~@(mapcat afn (partition 2 body)))))
(obj-to-map "hello" length :length toString :value)
=> {:value "hello", :length 5}