-
Notifications
You must be signed in to change notification settings - Fork 1
/
core.cljc
45 lines (40 loc) · 1.28 KB
/
core.cljc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
(ns chivorcam.core
(:refer-clojure :exclude [defmacro])
(:require
[cljs.env :as env]
[cljs.analyzer :as ana :refer [*cljs-ns*]]))
(defn- eval-form
[form ns]
(when-not (find-ns ns)
#?(:clj (create-ns ns)
:cljs (eval `(~'ns ~ns))))
(binding #?(:clj [*ns* (the-ns ns)]
:cljs [*ns* (find-ns ns)])
(#?(:clj do :cljs try)
(eval `(do
(clojure.core/refer-clojure)
~form))
#?(:cljs (catch :default e (throw (ex-cause e)))))))
(defn- fake-var [ns sym]
(symbol (str "#'" ns) (str sym)))
(defn- macros-ns [sym]
#?(:clj sym
:cljs (symbol (str sym "$macros"))))
(clojure.core/defmacro defmacfn
[name & args]
(let [form `(clojure.core/defn ~name ~@args)]
(if &env
(do
(eval-form form (macros-ns *cljs-ns*))
`'~(fake-var *cljs-ns* name))
form)))
(clojure.core/defmacro defmacro
[name & args]
(let [form `(clojure.core/defmacro ~name ~@args)]
(if &env
(do
(eval-form form (macros-ns *cljs-ns*))
(swap! env/*compiler* update-in [::ana/namespaces *cljs-ns* :require-macros] assoc *cljs-ns* *cljs-ns*)
(swap! env/*compiler* update-in [::ana/namespaces *cljs-ns* :use-macros] assoc name *cljs-ns*)
`'~(fake-var *cljs-ns* name))
form)))