3

私は一連の名前空間シンボルを持っています:

(def namespace-symbols (namespace-1 namespace-2 namespace-3))

そして、それぞれに対してまったく同じメソッド(たとえば、 )を呼び出したいと思いrunます。

(map #{%/run} namespace-symbols)

動作しません。

私も試しました

(defmacro namespace-run
  [namespace]
  `(~(identity namespace)/run))

これも機能しません。これを行う方法はありますか?

アップデート:

最終的に以下のようなマクロを思いつきました。

(defmacro namespace-run
  [namespace]
  `(~(symbol (str namespace "/run"))))

(macroexpand-1 '(namespace-run foobar))
;=> (foobar/run)

確かにこれを行うためのより良い方法はありますか?

4

2 に答える 2

4

clojure.core/ns-resolve を確認してください

(doseq [ns namespace-symbols]
  ((ns-resolve ns 'run))) ;; resolve and execute fn

のように扱うことができます。fn

(let [p (ns-resolve *ns* 'println)]
  (p "Hello")
  (p "World"))
于 2013-01-06T05:20:24.533 に答える
0

たぶん次のようなものを使用しますsymbol

clojure.core/symbol
([name] [ns name])
  Returns a Symbol with the given namespace and name.
于 2013-01-06T04:40:34.627 に答える