2010-09-25 104 views
7

我目前的方法:如果我知道有一個函數有一個bug,我將它的一小部分複製到REPL中,並評估它是否符合我的期望。要設置它,我必須將這個函數的參數定義爲虛擬輸入。不是非常耗時,但我知道有一個更有效的方法。推薦調試Clojure函數的方法?

有什麼建議嗎?

+4

剛剛發現,並從中學到了很多,此相關的問題:http://stackoverflow.com/questions/2352020/debugging-in-clojure,但如果任何人有關於思念我的具體情況(調試(純功能)函數的輸出)我會「接受」你的好主意!謝謝 – yayitswei 2010-09-25 02:45:19

+0

+1,因爲我希望我知道任何有關Lisp相關語言的知識 – JAL 2010-09-25 02:45:53

+0

我仍然在學習基礎知識,但是如果我需要跳躍到調試實際的腳本/模塊,我會檢查一個單元測試包: 'clojure.contrib.test-is'是一個; IIRC有一兩個人。 – intuited 2010-09-25 02:58:41

回答

4

請問這個宏的幫助?原來一個讓成一系列DEFS的,這樣就可以評估子表達式:

(defmacro def-let 
    "like let, but binds the expressions globally." 
    [bindings & more] 
    (let [let-expr (macroexpand `(let ~bindings)) 
     names-values (partition 2 (second let-expr)) 
     defs (map #(cons 'def %) names-values)] 
    (concat (list 'do) defs more))) 

我寫到這裏的解釋: http://www.learningclojure.com/2010/09/astonishing-macro-of-narayan-singhal.html

+0

哦,那真是太驚人了! – yayitswei 2010-10-08 09:39:16

1

的錯誤跨越幾個功能我喜歡Trace macro報告了呼叫並返回每個函數。

1

我寫了一個跟蹤庫,可以告訴你每個元素返回什麼值。
http://github.com/hozumi/eyewrap

+0

這與clojure.contrib.trace中的'dotrace'宏如何比較?他們似乎有相似的目標/功能。 – intuited 2010-09-28 21:30:40

+0

差異很微妙。 dotrace可以在每個函數調用的函數中深入追蹤指定函數。 eyewrap追蹤目標函數中的所有元素,並顯示淺層結果。 – 2010-09-29 15:51:16

1

函數版本的def-let,有些功勞可以去here

(defn def-let [aVec] 
    (if-not (even? (count aVec)) 
    aVec 
    (let [aKey (atom "")  
      counter (atom 0)] 
     (doseq [item aVec] 
     (if (even? @counter) 
      (reset! aKey item)   
      (intern *ns* (symbol @aKey) (eval item))) 
     ; (prn item)  
    (swap! counter inc))))) 

用法:需要引用內容的引用,例如,

(def-let '[a 1 b 2 c (atom 0)])