我当前的方法:如果有一个我知道的函数有错误,我将它的一些部分复制到REPL中并评估输出是否符合我的预期。要设置它,我必须将函数的参数作为虚拟输入。不是非常耗时,但我知道有一种更有效的方式。
有什么建议吗?
答案 0 :(得分:4)
这个宏有帮助吗?它将let转换为一系列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
答案 1 :(得分:2)
在阅读完之后,我最喜欢的方法是添加
(swank.core/break)
在函数内部并按't'检查值。 (我正在使用swank-clojure)
来源: http://hugoduncan.org/post/2010/swank_clojure_gets_a_break_with_the_local_environment.xhtml
答案 2 :(得分:1)
用于跨越多个函数的错误我喜欢Trace macro来报告每个函数的调用和返回。
答案 3 :(得分:1)
我写了一个跟踪库,它可以显示每个元素返回的值 http://github.com/hozumi/eyewrap
答案 4 :(得分: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)])