Skip to content

Instantly share code, notes, and snippets.

@moxaj
Created April 14, 2017 17:37
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 moxaj/d21f8f1db3e4cf32dcb12485a248070e to your computer and use it in GitHub Desktop.
Save moxaj/d21f8f1db3e4cf32dcb12485a248070e to your computer and use it in GitHub Desktop.
spec exception
(ns foo
(:require [clojure.spec :as s]
[clojure.walk :as walk]))
(defn- ->sym
"Returns a symbol from a symbol or var"
[x]
(if (var? x)
(let [^clojure.lang.Var v x]
(symbol (str (.name (.ns v)))
(str (.sym v))))
x))
(defn- unfn [expr]
(if (and (seq? expr)
(symbol? (first expr))
(= "fn*" (name (first expr))))
(let [[[s] & form] (rest expr)]
(conj (walk/postwalk-replace {s '%} form) '[%] 'fn))
expr))
(defn my-resolve [x]
(println "a" x)
(let [x (resolve x)]
(println "b")
x))
(defn- res [form]
(cond
(keyword? form) form
(symbol? form) (or (-> form my-resolve ->sym) form)
(sequential? form) (walk/postwalk #(if (symbol? %) (res %) %) (unfn form))
:else form))
(defmacro def [x]
`(or '~(res x)))
(foo/def 'a.a)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment