0

与其返回我的库并添加“调试”标志参数,我认为一旦在我的应用程序的命令行上读取了调试标志 (0/1),就可以设置一次 ref,然后由任何函数访问如果设置了调试标志,则需要做一些事情。

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

谢谢。

4

3 回答 3

3

我建议您避免重复(when *debug* ...)所有代码。这是宏的主要目标。编写一个执行该检查的宏,因此您可以使用类似(debug ...stuff...). 好的,它并没有更短,但是它将您的代码与检查调试标志的细节分离。更好的是,它为您提供了编写代码的机会,该代码完全消除了调试标志的运行时检查,并且只在编译时进行。

于 2012-04-11T14:04:02.577 回答
1

您对该标志的使用符合应用程序配置,这很好。前进!

于 2012-04-11T12:54:26.900 回答
1

这种事情的全局是好的,尽管使用 ref 来存储它并不是很合适,因为那样你就需要在事务中完成所有日志记录(即在 a 中(dosync))。

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

这样的事情会很好:

(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*打开调试。在这个例子中,假设所有的函数都使用了上面提到的函数。您已设置为 false,但您只想为. 您可以为该调用重新绑定标志,如下所示:(debug)*debug-enabled*(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))
于 2012-04-11T12:58:55.057 回答