Debugging 如何在OCaml中跟踪调试程序?

Debugging 如何在OCaml中跟踪调试程序?,debugging,coding-style,ocaml,Debugging,Coding Style,Ocaml,我有一个关于编码实践的一般性问题 调试时,在我的代码的某个点,我需要一些代码来打印当前状态;当我不调试时,我不想把代码留在那里,因为它会影响其他代码的可见性 很难将它们打包成一个函数,因为大多数情况下,它涉及局部变量,我不想将所有内容都作为参数传递 那么,您通常如何管理这种“打印/检查”代码?有什么好的做法吗?我经常使用一个调试函数,它只在调试标志设置为true时才打印值: let debug_flag = ref false let debug fmt = if !debug_flag

我有一个关于编码实践的一般性问题

调试时,在我的代码的某个点,我需要一些代码来打印当前状态;当我不调试时,我不想把代码留在那里,因为它会影响其他代码的可见性

很难将它们打包成一个函数,因为大多数情况下,它涉及局部变量,我不想将所有内容都作为参数传递


那么,您通常如何管理这种“打印/检查”代码?有什么好的做法吗?

我经常使用一个调试函数,它只在调试标志设置为true时才打印值:

let debug_flag = ref false

let debug fmt = 
  if !debug_flag then Printf.eprintf fmt 
  else Printf.ifprintf stderr fmt

我以前有一个调试函数,只有在设置了标志的情况下才打印最终字符串。现在,我只想添加
if
语句:

  • 它们不长了
  • 如果条件为false,则不会计算任何内容
  • 阅读代码时很容易看出它只是用于调试
我以前也有camlp4宏,它可以从函数应用程序生成
if
语句,但它只在使用camlp4的项目中起作用,我现在倾向于避免使用它


请注意,通常,我使用的不是一个调试标志,而是许多调试标志,每个模块一个,然后是元标记,它们将触发多个模块或正交方面的调试。它们作为标志列表放在哈希表中,我可以用参数或环境变量设置它们。

我使用日志语法扩展:

您还可以使用
Loc.start\u line\u Loc
(也许我会添加它)将行号传递给日志功能(在上面的源代码中硬编码为
AuxIO.log

注意,条件应该是语法扩展的一部分,这样,如果不需要打印参数,它就不会计算参数。此外,我们还有灵活的“printf”语法

此外,我在Emacs中使用了一个命令:

(defun camldev-insert-log-entry ()
  (interactive)
  (insert "(* {{{ log entry *)
LOG 2 \"\";
(* }}} *)")
  (goto-char (- (point) 12)))

与“折叠模式”一起使用。

问题是。。。我想打印的内容包括几行,涉及许多局部变量……这个调试函数的问题是,参数总是被计算出来的,即使在最后没有使用它们。