调试Clojure函数的推荐方法?

时间:2010-09-25 02:43:13

标签: debugging clojure

我当前的方法:如果有一个我知道的函数有错误,我将它的一些部分复制到REPL中并评估输出是否符合我的预期。要设置它,我必须将函数的参数作为虚拟输入。不是非常耗时,但我知道有一种更有效的方式。

有什么建议吗?

5 个答案:

答案 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)])