我有这样的命名空间:
(ns foo.core)
(def ^:dynamic *debug-fn*
"A function taking arguments [bar baz]"
nil)
(defn bar-info
[bar _]
(println bar))
(defn baz-info
[_ baz]
(println baz))
(defn do-stuff
[bar baz]
(when *debug-fn* (*debug-fn* bar baz)))
(defn -main
[& {:keys [debug-fn]}]
(binding [*debug-fn* (symbol debug-fn)] ;; THIS WON'T WORK!
(do-stuff 27 42)))
Run Code Online (Sandbox Code Playgroud)
我想要做的是允许从命令行指定调试函数,如下所示:lein run bar-info
或lein run baz-info
.
我不确定如何将指定的字符串作为命令行参数,并将其转换为要绑定的名称空间限定函数.我需要一个宏来做这个吗?
使用ns-resolve,您需要指定定义函数的命名空间.
user=> (defn f [n] (* n n n))
#'user/f
user=> ((ns-resolve *ns* (symbol "f")) 10)
1000
Run Code Online (Sandbox Code Playgroud)