2012-02-24 84 views
9

我有一個關於編碼實踐的一般問題...如何在OCaml中跟蹤調試程序?

調試時,在我的代碼的某個時候,我需要一些代碼來打印當前狀態;當我不調試時,我不想將代碼留在那裏,因爲它妨礙了其他代碼的可見性...

很難將它們打包成一個函數,因爲大部分時間它涉及局部變量,我不想把所有的東西都作爲參數傳遞出去......

那麼你如何管理這種「打印/檢查」代碼呢?有沒有好的做法?

回答

5

我經常用它打印,只有當調試標誌設置爲true值的調試功能:

let debug_flag = ref false 

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

事情是......我要打印的內容涵蓋幾行,涉及到很多局部變量...... – SoftTimur 2012-02-24 08:32:51

+1

這個調試函數的問題是參數總是被計算出來的,即使它們沒有在最後被使用。 – 2012-02-24 08:34:41

6

我曾經有一個調試功能,這將只打印最後一個字符串只有一個標誌是組。現在,我寧願只加if聲明:

  • 他們不是長得
  • 沒有被計算是條件爲假
  • 很容易在閱讀代碼,看看它是僅用於調試

我也曾經有過camlp4宏,會產生從功能應用if語句,但它只是在使用camlp4項目,我傾向於避免時下的作品。

請注意,我通常不使用一個調試標誌,而是使用許多調試標誌,每個模塊一個,然後使用元標籤來觸發幾個模塊或正交方面的調試。它們被放在一個散列表中作爲標誌列表,我可以使用參數或環境變量來設置它們。

4

我使用的測井語法擴展:使用Loc.start_line _loc(也許我會

http://toss.svn.sourceforge.net/viewvc/toss/trunk/Toss/caml_extensions/pa_log.ml?revision=1679&view=markup

您還可以傳遞行號記錄功能(這是硬編碼到AuxIO.log在源上方)添加它)。

請注意,條件應該是語法擴展的一部分,這樣,如果它不需要打印它們,它將不會計算參數。另外,我們還有靈活的「printf」語法。

另外,我在Emacs使用一個命令:

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

用`摺疊模式」在一起。