用memfn定义函数

时间:2012-07-17 11:38:11

标签: macros clojure

我正在研究一些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 ...])

我需要在宏中更改或添加正确行为的内容?

感谢。

1 个答案:

答案 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]])