如何在几个Clojure命名空间中调用相同的方法?

时间:2013-01-06 04:15:05

标签: clojure

我有一系列名称空间符号:

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

当然有更好的方法吗?

2 个答案:

答案 0 :(得分: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"))

答案 1 :(得分:0)

也许使用类似symbol

的内容
clojure.core/symbol
([name] [ns name])
  Returns a Symbol with the given namespace and name.