代码之家  ›  专栏  ›  技术社区  ›  yayitswei

调试Clojure函数的推荐方法?

  •  7
  • yayitswei  · 技术社区  · 15 年前

    我目前的方法是:如果我知道某个函数有一个bug,我会将它的一部分复制到REPL中,然后评估输出是否符合我的期望。要设置它,我必须将函数的参数定义为伪输入。不是很费时,但我知道有一个更有效的方法。

    有什么建议吗?

    5 回复  |  直到 15 年前
        1
  •  4
  •   John Lawrence Aspden    15 年前

    这个宏有帮助吗?它将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

        2
  •  2
  •   yayitswei    15 年前

    读完这篇文章后,我最喜欢的新方法是

    (swank.core/break)
    

    在函数内部,按“t”检查值。(我用的是swank clojure)

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

        3
  •  1
  •   Arthur Ulfeldt    15 年前

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

        5
  •  1
  •   Community Mohan Dere    9 年前

    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)])
    
    推荐文章