Last active
November 30, 2017 08:00
-
-
Save stathissideris/7bc8c1f4f16de835a6ef91ce418e9562 to your computer and use it in GitHub Desktop.
naive Clojure macro for tracing all forms
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; there are quite a few cases where this code would not work, use with caution and check the macro expansion | |
(require '[clojure.walk :as walk]) | |
(defn- clean-dont [form] | |
(walk/postwalk | |
(fn [form] | |
(if (and (list? form) (= 'dont (first form))) | |
(second form) | |
form)) | |
form)) | |
(defn- trace [code res] | |
(log/info (pr-str code) "=>" res) | |
res) | |
(defn- trace-maybe [form] | |
(cond (and (list? form) (= 'dont (first form))) (second form) | |
(list? form) `(trace-forms ~form) | |
:else form)) | |
(defn- trace-let [form] | |
`(trace | |
(quote ~form) | |
(let ~(vec (mapcat (fn [[k v]] | |
[k (trace-maybe v)]) | |
(partition 2 (second form)))) | |
~@(map trace-maybe (drop 2 form))))) | |
(defmacro trace-forms [form] | |
(if-not (list? form) | |
form | |
(cond (and (list? form) (= 'dont (first form))) | |
(let [inner (second form)] | |
`(~(first inner) ~@(map trace-maybe (rest inner)))) | |
(and (list? form) (= 'let (first form))) | |
(trace-let form) | |
:else | |
`(trace (quote ~(clean-dont form)) | |
~(map trace-maybe form))))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Usage: