【问题标题】:Recommended ways to debug Clojure functions?调试 Clojure 函数的推荐方法?
【发布时间】:2011-04-17 01:47:58
【问题描述】:

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

有什么建议吗?

【问题讨论】:

  • 刚刚发现并从中学到了很多,这个相关问题:stackoverflow.com/questions/2352020/debugging-in-clojure,但如果有人对我的具体案例有想法(调试(纯功能)函数的输出),我会“接受”你的好主意!谢谢
  • +1 因为我希望我对 Lisp 相关语言有所了解
  • 我还在学习基础知识,但是如果我需要提前调试一个实际的脚本/模块,我会检查一个单元测试包:clojure.contrib.test-is 是一个; IIRC 还有一两个其他的。

标签: debugging clojure


【解决方案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)])

【讨论】:

    【解决方案2】:

    我编写了一个跟踪库,它可以显示每个元素返回的值。
    http://github.com/hozumi/eyewrap

    【讨论】:

    • 这与clojure.contrib.trace 中的dotrace 宏相比如何?它们似乎具有相似的目标/功能。
    • 差异是微妙的。 dotrace 可以在目标函数调用的每个函数中深度跟踪指定函数。 eyewrap 跟踪目标函数中的所有元素并向您显示肤浅的结果。
    【解决方案3】:

    对于跨越多个函数的错误,我喜欢 Trace macro 用于报告每个函数的调用和返回。

    【讨论】:

      【解决方案4】:

      这个宏有帮助吗?它将 let 转换为一系列 def,以便您可以评估子表达式:

      (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

      【讨论】:

      • 哦,这太惊人了!
      【解决方案5】:

      读完后,我最喜欢的新方法是添加

      (swank.core/break)
      

      在函数内部并按“t”检查值。 (我正在使用 swank-clojure)

      来源: http://hugoduncan.org/post/2010/swank_clojure_gets_a_break_with_the_local_environment.xhtml

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-04
        • 1970-01-01
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多