YK
Size: a a a
YK
DL
YK
YK
(defmacro bar
[v]
(let [v' (map inc (eval (unquote v)))]
`(identity ~v’)))
YK
DL
DL
YK
DL
DL
DL
VM
(defmacro bar
[v]
(let [v' (map inc v)]
`(identity ~v')))
(macroexpand-1
'(bar [1 2 3]))
(macroexpand-1
'(bar (when true [1 2 3])))
YK
(defmacro deftest
[sym value]
(let [value (cljs.core/clj->js value)]
`(def ~sym ~value)))
YK
A
VM
VM
(ns foo
(:require [cljs.analyzer :as analyzer]))
(defn resolve-sym
"Resolves a var for the analysis environment and symbol specified in `env` and `sym`
parameters. Returns a vector with a resolved var and it's meta."
[env sym]
(let [[var meta] (try
(let [var (analyzer/resolve-var env
sym
(analyzer/confirm-var-exists-throw))]
[var (analyzer/var-meta var)])
(catch #?@(:clj [Throwable t] :cljs [:default e])
[(analyzer/resolve-var env sym) nil]))
resolved (vary-meta (:name var) assoc ::analyzer/no-resolve true)]
[resolved meta]))
(defn resolved->var
"Converts `[resolved meta]` tuple to a var."
[[resolved meta]]
`(cljs.core/Var. (fn [] ~resolved) '~resolved ~meta))
(defmacro component-spec-def
"Registers function specs (fdef) for the `component-sym`."
[component-sym]
(let [env &env
[resolved-sym component-meta] (resolve-sym env component-sym)
component-fn-sym (-> component-meta
:component-fn
(second)
(normalize-symbol component-meta))
[_ component-fn-meta] (resolve-sym env component-fn-sym)
default-parameters-keys (-> component-fn-meta
:arglists
second first first
:or
keys
(->> (map keyword))
set)
required? (fn [p] (not (contains? default-parameters-keys (:name p))))
params (second (:params component-meta))
ns-name (str (get-in env [:ns :name]))
req-un (mapv #(->> % :name name (keyword ns-name)) (filter required? params))
opt-un (mapv #(->> % :name name (keyword ns-name)) (filter (comp not required?) params))]
`(when ^boolean js/goog.DEBUG
~@(for [p params
:let [s (:spec p)]
:when (and (keyword? s) (not= (namespace s) ns-name))]
`(cljs.spec.alpha/def ~(keyword ns-name (name (:name p))) ~s))
(cljs.spec.alpha/fdef ~component-sym
:args (cljs.spec.alpha/cat
:args (cljs.spec.alpha/keys :req-un ~req-un :opt-un ~opt-un)))
(cljs.spec.test.alpha/instrument (quote ~resolved-sym)))))
ST
(ns foo
(:require [cljs.analyzer :as analyzer]))
(defn resolve-sym
"Resolves a var for the analysis environment and symbol specified in `env` and `sym`
parameters. Returns a vector with a resolved var and it's meta."
[env sym]
(let [[var meta] (try
(let [var (analyzer/resolve-var env
sym
(analyzer/confirm-var-exists-throw))]
[var (analyzer/var-meta var)])
(catch #?@(:clj [Throwable t] :cljs [:default e])
[(analyzer/resolve-var env sym) nil]))
resolved (vary-meta (:name var) assoc ::analyzer/no-resolve true)]
[resolved meta]))
(defn resolved->var
"Converts `[resolved meta]` tuple to a var."
[[resolved meta]]
`(cljs.core/Var. (fn [] ~resolved) '~resolved ~meta))
(defmacro component-spec-def
"Registers function specs (fdef) for the `component-sym`."
[component-sym]
(let [env &env
[resolved-sym component-meta] (resolve-sym env component-sym)
component-fn-sym (-> component-meta
:component-fn
(second)
(normalize-symbol component-meta))
[_ component-fn-meta] (resolve-sym env component-fn-sym)
default-parameters-keys (-> component-fn-meta
:arglists
second first first
:or
keys
(->> (map keyword))
set)
required? (fn [p] (not (contains? default-parameters-keys (:name p))))
params (second (:params component-meta))
ns-name (str (get-in env [:ns :name]))
req-un (mapv #(->> % :name name (keyword ns-name)) (filter required? params))
opt-un (mapv #(->> % :name name (keyword ns-name)) (filter (comp not required?) params))]
`(when ^boolean js/goog.DEBUG
~@(for [p params
:let [s (:spec p)]
:when (and (keyword? s) (not= (namespace s) ns-name))]
`(cljs.spec.alpha/def ~(keyword ns-name (name (:name p))) ~s))
(cljs.spec.alpha/fdef ~component-sym
:args (cljs.spec.alpha/cat
:args (cljs.spec.alpha/keys :req-un ~req-un :opt-un ~opt-un)))
(cljs.spec.test.alpha/instrument (quote ~resolved-sym)))))
VM
VM