2

我正在研究一些 java 库包装器。我们有一些带有方法的对象,可以使用(.method object ...). 我想用更多的功能创建更方便的 api (method object ...)

我写了一个简单的宏:

(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 ...])

我需要在宏中更改什么或为正确的行为添加一些东西?

谢谢。

4

1 回答 1

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]])
于 2012-07-17T12:48:06.517 回答