Skip to content

Instantly share code, notes, and snippets.

@olivergeorge
Created November 8, 2017 04:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save olivergeorge/651bbf93fe92f6a16a2bf4f09d4e1451 to your computer and use it in GitHub Desktop.
Save olivergeorge/651bbf93fe92f6a16a2bf4f09d4e1451 to your computer and use it in GitHub Desktop.
Super simple scope capture macro for CLJS. Hoping to make it simpler.
(ns can-i-spy.dbg
(:require [clojure.spec.alpha :as s]))
(defonce dbg-meta (atom {}))
#?(:cljs (defonce dbg-data (atom {})))
(defmacro spy
[k]
(let [symbols (keys (:locals &env))
locals (zipmap (map (fn [sym] `(quote ~sym)) symbols) symbols)
location (-> &form meta)]
(swap! dbg-meta update k conj {:location location :symbols symbols})
`(do (swap! dbg-data update ~k conj {:location ~location :locals ~locals}) nil)))
(defmacro locals
[k]
`(:locals (first (get @dbg-data ~k))))
(defmacro post-mortem
[k]
(let [{:keys [symbols location] :as data} (first (get @dbg-meta k))
def-sym (fn [sym]
`(let [m# (first (get @dbg-data ~k))
val# (get (:locals m#) '~sym)]
(def ~sym val#)))]
(s/assert (s/coll-of symbol?) symbols)
(s/assert map? location)
`(let [m# (first (get @dbg-data ~k))]
(do (println "Set up post-mortem of line" (:line (:location m#)) "of" (:file (:location m#)))
(println "Symbols: " ~(pr-str symbols))
~@(map def-sym symbols)
m#))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment