我认为一旦在我的应用程序的命令行上读取了调试标志(0/1),就可以设置一次ref然后访问,而不是通过我的库并添加“debug”标志参数。通过设置调试标志时需要执行某些操作的任何函数。
这是处理无参数调试的合理方法,还是我的想法太像是“禁止”全局变量?
感谢。
答案 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))