Skip to content

Instantly share code, notes, and snippets.

@sunilnandihalli
Created December 6, 2010 05:20
Show Gist options
  • Select an option

  • Save sunilnandihalli/729915 to your computer and use it in GitHub Desktop.

Select an option

Save sunilnandihalli/729915 to your computer and use it in GitHub Desktop.
(let [level (atom 0)]
(defmacro inc-level [] (swap! level inc) nil)
(defmacro dec-level [] (swap! level dec) nil)
(defmacro with-separator [& body]
`(do
(inc-level)
(println)
(println ~(str "----------------------------start-" @level "-----------------------"))
(let [x# (do ~@body)]
(println ~(str "------------------------------end-" @level "-----------------------"))
(dec-level)
x#))))
(let [*stack-of-local-binding-maps* (atom '())]
(defmacro pop-environment [] (swap! *stack-of-local-binding-maps* pop) nil)
(defmacro push-environment [] (swap! *stack-of-local-binding-maps* conj &env) nil)
(defmacro dnlbh [& body]
(let [new-locals (->> (clojure.set/difference (set &env)
(set (first @*stack-of-local-binding-maps*)))
(into {}) keys)
print-statements (map (fn [x] `(println ['~x ~x])) new-locals)]
`(with-separator
~@print-statements
(push-environment)
(let [x# (do ~@body)]
(dorun (map clojure.pprint/pprint ['~&form " returned " x#]))
(pop-environment)
x#)))))
(display-new-local-bindings
(let [x 10]
(display-new-local-bindings
(let [y 20]
(display-new-local-bindings (+ x y))))))
;would print
;----------------------------start-0-----------------------
;[x 10]
;----------------------------start-1-----------------------
;[y 20]
;------------------------------end-1-----------------------
;------------------------------end-0-----------------------
; and return
;30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment