[フレーム]
Last Updated: February 25, 2016
·
5.327K
· killme2008

break point in clojure

A macro from 《the joy of clojure》 for debugging:

(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)

1 Response
Add your response

I guess I really need to read the "Joy of clojure"... Nice to share that. Thnx! :-)

over 1 year ago ·

AltStyle によって変換されたページ (->オリジナル) /