我有一個關於編碼實踐的一般問題...如何在OCaml中跟蹤調試程序?
調試時,在我的代碼的某個時候,我需要一些代碼來打印當前狀態;當我不調試時,我不想將代碼留在那裏,因爲它妨礙了其他代碼的可見性...
很難將它們打包成一個函數,因爲大部分時間它涉及局部變量,我不想把所有的東西都作爲參數傳遞出去......
那麼你如何管理這種「打印/檢查」代碼呢?有沒有好的做法?
我有一個關於編碼實踐的一般問題...如何在OCaml中跟蹤調試程序?
調試時,在我的代碼的某個時候,我需要一些代碼來打印當前狀態;當我不調試時,我不想將代碼留在那裏,因爲它妨礙了其他代碼的可見性...
很難將它們打包成一個函數,因爲大部分時間它涉及局部變量,我不想把所有的東西都作爲參數傳遞出去......
那麼你如何管理這種「打印/檢查」代碼呢?有沒有好的做法?
我經常用它打印,只有當調試標誌設置爲true值的調試功能:
let debug_flag = ref false
let debug fmt =
if !debug_flag then Printf.eprintf fmt
else Printf.ifprintf stderr fmt
我曾經有一個調試功能,這將只打印最後一個字符串只有一個標誌是組。現在,我寧願只加if
聲明:
我也曾經有過camlp4宏,會產生從功能應用if
語句,但它只是在使用camlp4項目,我傾向於避免時下的作品。
請注意,我通常不使用一個調試標誌,而是使用許多調試標誌,每個模塊一個,然後使用元標籤來觸發幾個模塊或正交方面的調試。它們被放在一個散列表中作爲標誌列表,我可以使用參數或環境變量來設置它們。
我使用的測井語法擴展:使用Loc.start_line _loc
(也許我會
您還可以傳遞行號記錄功能(這是硬編碼到AuxIO.log
在源上方)添加它)。
請注意,條件應該是語法擴展的一部分,這樣,如果它不需要打印它們,它將不會計算參數。另外,我們還有靈活的「printf」語法。
另外,我在Emacs使用一個命令:
(defun camldev-insert-log-entry()
(interactive)
(insert "(* {{{ log entry *)
LOG 2 \"\";
(* }}} *)")
(goto-char (- (point) 12)))
用`摺疊模式」在一起。
事情是......我要打印的內容涵蓋幾行,涉及到很多局部變量...... – SoftTimur 2012-02-24 08:32:51
這個調試函數的問題是參數總是被計算出來的,即使它們沒有在最後被使用。 – 2012-02-24 08:34:41