【问题标题】:effective debugging method when using trampoline使用蹦床时的有效调试方法
【发布时间】:2016-06-30 21:18:48
【问题描述】:

我是 clojure 新手,使用 clojure 1.8,主要使用 vim 进行编辑。我不太了解vim插件。

我不知道在没有plintln 的情况下使用trampoline 来调试程序,因为在我看来,知道这一点很重要:

  • trampoline
  • 调用的函数的顺序
  • 函数的参数

但是plintln 的调试往往会给维护带来麻烦——因为括号太多,所以很难阅读。并且使用太多plintln 经常会导致性能问题。我不想切换评论或注释掉 每当调试和发布。 使用trampoline的程序有什么好的调试方法吗?

【问题讨论】:

    标签: clojure


    【解决方案1】:

    我在一篇文章“break point in clojure”中找到了一种将调试器功能添加到 REPL 中的方法。也许我应该从一开始就考虑可用的调试器......

    (defn contextual-eval [ctx expr]
        (eval                                           
            `(let [~@(mapcat (fn [[k v]] [k `'~v]) ctx)] 
                 ~expr)))
    (defmacro local-context []
        (let [symbols (keys &env)]
            (zipmap (map (fn [sym] `(quote ~sym)) symbols) symbols)))
    (defn readr [prompt exit-code]
        (let [input (clojure.main/repl-read prompt exit-code)]
            (if (= input ::tl)
                exit-code
                 input)))
    ;;make a break point
    (defmacro break []
      `(clojure.main/repl
        :prompt #(print "debug=> ")
        :read readr
        :eval (partial contextual-eval (local-context))))
    
    
    Usage:
    
    (defn div [n d] (break) (int (/ n d)))
    (div 10 0)
    debug=> n
    10
    debug=> d
    0
    debug=> (local-context)
    {n 10, d 0}
    debug=> ::tl
    ArithmeticException Divide by zero  clojure.lang.Numbers.divide (Numbers.java:156)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 2014-12-30
      • 2010-09-16
      相关资源
      最近更新 更多