我正在研究一些java库包装器。
我们有一些方法对象,可以用(.method object ...)
调用它们。我想用函数(method object ...)
创建更方便的api。
我写了一个简单的宏:
(defmacro ^{:private true} gen-method [method & argv]
`(def ~method (memfn ~method ~@argv)))
现在我可以调用(gen-method charAt i)
,之后我可以使用(charAt "string" 1)
。
但我有很多方法可以生成并希望使用类似的东西:
(map #(gen-method (-> %1 name symbol arg)) [:charAt :substring ...])
但这不起作用。下一个例子也不起作用:
(map #(let [fname (-> %1 name symbol)] (gen-method fname arg)) [:charAt :substring ...])
我需要在宏中更改或添加正确行为的内容?
感谢。
答案 0 :(得分:4)
您必须在宏本身内部执行map
操作,因为map
操作应该在编译时发生,即形成扩展时间而不是在运行时。
如下所示:
(defmacro ^{:private true} gen-methods [methods]
`(do
~@(map (fn [[x & i]] (let [m (-> x name symbol)] `(def ~m (memfn ~m ~@i)) )) methods)))
(gen-methods [ [:charAt i] [:substring i]])