Hi Philos, Without getting into how to implement this, the `spyscope` library and the `clojure.tools.logging` library implement this pattern in their `spy` macro and #spy/d reader literal respectively. So you could either add them to your development toolkit (recommended) or you could read their implementations.
https://github.com/clojure/tools.logging/blob/master/src/main/clojure/clojure/tools/logging.clj#L120 https://github.com/dgrnbrg/spyscope Cheers, Beau On Tuesday, September 6, 2016 at 4:30:09 AM UTC-7, Philos Kim wrote: > > I appreciate your reply. > > The following is the entire code where I encountered this problem. > My intention was for debugging purpose to print the result of every nested > expression in a form. > > > (ns debux.lab > (:require (clojure [walk :as walk]))) > > ;; For debugging > (defmacro dbg_ > [form] > `(let [return# ~form] > (println ">> dbg_:" (pr-str '~form) "=>" return# "<<") > return#)) > > (def a 2) > (def b 3) > (def c 5) > > (defn- dispatch > [node] > (cond > (list? node) > (do (eval `(dbg_ ~node)) > node) > > (and (symbol? node) > (not (fn? (eval `~node)))) > (do (eval `(dbg_ ~node)) > node) > > :else node)) > > (defn- tree-walk > [tree] > (walk/postwalk dispatch tree)) > > > ;; dbg for nested expressions > (defmacro dbgn [form] > (tree-walk form)) > > > ;;; test samples > > ;; This works because every symbol is declared in global symbols > (dbgn (* c (+ a b))) > ; >> dbg_: c => 5 << > ; >> dbg_: a => 2 << > ; >> dbg_: b => 3 << > ; >> dbg_: (+ a b) => 5 << > ; >> dbg_: (* c (+ a b)) => 25 << > > > ;; This works too, because literal syntax-quotes are used. > (let [a 10 b 20 c 30] > (eval `(* ~c (+ ~a ~b)))) > ; => 900 > > > ;; But this doesn't work, because literal syntax-quotes can't be used in > this case. > (let [a 10 b 20 c 30] > (dbgn (* c (+ a b)))) > ; 2. Unhandled clojure.lang.Compiler$CompilerException > ; Error compiling work/philos/debux/src/debux/lab.clj at (52:3) > ; > ; 1. Caused by java.lang.UnsupportedOperationException > ; Can't eval locals > ; > ; Compiler.java: 5943 > clojure.lang.Compiler$LocalBindingExpr/eval > ; Compiler.java: 6932 clojure.lang.Compiler/eval > ; Compiler.java: 6890 clojure.lang.Compiler/eval > ; core.clj: 3105 clojure.core/eval > ; core.clj: 3101 clojure.core/eval > ; ...... > > > Any suggestion in this case? > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.