我目前的方法:如果我知道有一個函數有一個bug,我將它的一小部分複製到REPL中,並評估它是否符合我的期望。要設置它,我必須將這個函數的參數定義爲虛擬輸入。不是非常耗時,但我知道有一個更有效的方法。推薦調試Clojure函數的方法?
有什麼建議嗎?
我目前的方法:如果我知道有一個函數有一個bug,我將它的一小部分複製到REPL中,並評估它是否符合我的期望。要設置它,我必須將這個函數的參數定義爲虛擬輸入。不是非常耗時,但我知道有一個更有效的方法。推薦調試Clojure函數的方法?
有什麼建議嗎?
請問這個宏的幫助?原來一個讓成一系列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
哦,那真是太驚人了! – yayitswei 2010-10-08 09:39:16
在這讀了之後,我的新寵方法是添加
(swank.core/break)
裏面的功能,並通過按「T」檢查值。 (我使用的自吹,Clojure)都
來源: http://hugoduncan.org/post/2010/swank_clojure_gets_a_break_with_the_local_environment.xhtml
的錯誤跨越幾個功能我喜歡Trace macro報告了呼叫並返回每個函數。
我寫了一個跟蹤庫,可以告訴你每個元素返回什麼值。
http://github.com/hozumi/eyewrap
這與clojure.contrib.trace中的'dotrace'宏如何比較?他們似乎有相似的目標/功能。 – intuited 2010-09-28 21:30:40
差異很微妙。 dotrace可以在每個函數調用的函數中深入追蹤指定函數。 eyewrap追蹤目標函數中的所有元素,並顯示淺層結果。 – 2010-09-29 15:51:16
函數版本的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)])
剛剛發現,並從中學到了很多,此相關的問題:http://stackoverflow.com/questions/2352020/debugging-in-clojure,但如果任何人有關於思念我的具體情況(調試(純功能)函數的輸出)我會「接受」你的好主意!謝謝 – yayitswei 2010-09-25 02:45:19
+1,因爲我希望我知道任何有關Lisp相關語言的知識 – JAL 2010-09-25 02:45:53
我仍然在學習基礎知識,但是如果我需要跳躍到調試實際的腳本/模塊,我會檢查一個單元測試包: 'clojure.contrib.test-is'是一個; IIRC有一兩個人。 – intuited 2010-09-25 02:58:41