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 回答