我目前的方法:如果我知道有一个函数有一个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