2016-06-30 62 views
-1

我是clojure的新手,使用clojure 1.8,主要是用vim編輯。我不太瞭解vim插件。使用蹦牀時的有效調試方法

我不知道使用trampoline調試程序,而無需plintln,因爲,在我看來,它知道是很重要的:

  • 順序由trampoline調用的函數調用和
  • 的函數的參數

但是通過plintln進行調試往往會造成維護方面的麻煩 - 由於括號太多而導致閱讀問題。並且使用太多的plintln通常會導致性能問題。無論何時調試和發佈,我都不想將評論或評論切換出 。 對於使用trampoline的程序,是否有任何好的調試方法?

回答

0

我發現了一種在「break point in clojure」文章中將調試器函數添加到REPL中的方法。也許我應該從第一個地方考慮​​可用的調試器...

(defn contextual-eval [ctx expr] 
    (eval           
     `(let [[email protected](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)