在Clojure中从命令行设置调试功能

Jos*_*ver 2 clojure

我有这样的命名空间:

(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-infolein run baz-info.

我不确定如何将指定的字符串作为命令行参数,并将其转换为要绑定的名称空间限定函数.我需要一个宏来做这个吗?

Gui*_*ler 6

使用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)