2010-09-25 29 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)])