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

操作は実行時ではなく、コンパイル時、つまりフォームの展開時に行われる必要があるため、マクロ自体の内部で操作を実行する必要がありますmapmap

以下のようなもの:

(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 に答える