使用蹦床时的有效调试方法

时间:2016-06-30 21:18:48

标签: clojure

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

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

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

然而plintln的调试往往会给维护带来麻烦 - 由于括号太多而无法阅读牧师。使用太多plintln经常会导致性能问题。我不想切换评论或评论 每当调试和发布时。 是否有使用trampoline调试程序的好方法?

1 个答案:

答案 0 :(得分:0)

我找到了一种在“as instructed”文章中将调试器函数添加到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)