实现调试标志

时间:2012-04-11 12:41:21

标签: clojure

我认为一旦在我的应用程序的命令行上读取了调试标志(0/1),就可以设置一次ref然后访问,而不是通过我的库并添加“debug”标志参数。通过设置调试标志时需要执行某些操作的任何函数。

这是处理无参数调试的合理方法,还是我的想法太像是“禁止”全局变量?

感谢。

3 个答案:

答案 0 :(得分:3)

我建议你不要在代码中重复(when *debug* ...)。这是宏的主要目标。编写一个执行该检查的宏,以便您可以使用类似(debug ...stuff...)的内容。好吧,它不会短得多,但它会将您的代码与检查调试标志的细节分离。更好的是,它为您提供了编写代码的机会,这些代码完全消除了调试标志的运行时检查,并且仅在编译时执行。

答案 1 :(得分:1)

您对此标志的使用与应用程序配置一致,这很好。出去!

答案 2 :(得分:1)

这种事情的全球性很好,虽然使用ref存储它并不合适,因为那时你需要在事务中进行所有日志记录(即在(dosync)内)

由于您不太可能真正关心“启用日志记录”的竞争条件,因此不需要特殊保护。你用 ear-muffs 标记这个变量,表示它具有特殊意义......

这样的事情会很好:

(def ^{:dynamic true} *debug-enabled* false)
(def ^{:dynamic true} *info-enabled* false)

(defn- log [level s]
  (println (apply str (cons (str "[" level "] ") s))))

(defn debug [ & s ]
  (when *debug-enabled*
    (log "DEBUG" s)))

(defn info [ & s ]
  (when *info-enabled*
    (log "INFO" s)))

请注意,通过定义*debug-enabled*标志动态,您可以为代码的部件启用调试。在此示例中,假设所有函数都使用上面提到的(debug)函数。您将*debug-enabled*设置为false,但是您只想为(my-problematic-func)打开它。您可以像这样重新绑定该调用的标志:

(myfunc a b c)
(my-other-func d e f)
(binding [*debug-enabled* true] ; switch on debug for my-problematic-func
   (my-problematic-func g h i))