|
4 | 4 | "Makes sure that all changes to `src` are reflected in `dst`."
|
5 | 5 | [src dst]
|
6 | 6 | (add-watch src dst
|
7 |
| - (fn [_ src old new] |
8 |
| - (alter-var-root dst (constantly @src)) |
9 |
| - (alter-meta! dst merge (dissoc (meta src) :name))))) |
| 7 | + (fn [_ src old new] |
| 8 | + (alter-var-root dst (constantly @src)) |
| 9 | + (alter-meta! dst merge (dissoc (meta src) :name))))) |
10 | 10 |
|
11 | 11 | (defmacro import-fn
|
12 | 12 | "Given a function in another namespace, defines a function with the
|
13 | 13 | same name in the current namespace. Argument lists, doc-strings,
|
14 | 14 | and original line-numbers are preserved."
|
15 | 15 | ([sym]
|
16 |
| - `(import-fn ~sym nil)) |
| 16 | + `(import-fn ~sym nil)) |
17 | 17 | ([sym name]
|
18 |
| - (let [vr (resolve sym) |
19 |
| - m (meta vr) |
20 |
| - n (or name (:name m)) |
21 |
| - arglists (:arglists m) |
22 |
| - protocol (:protocol m)] |
23 |
| - (when-not vr |
24 |
| - (throw (IllegalArgumentException. (str "Don't recognize " sym)))) |
25 |
| - (when (:macro m) |
26 |
| - (throw (IllegalArgumentException. |
27 |
| - (str "Calling import-fn on a macro: " sym)))) |
| 18 | + (let [vr (resolve sym) |
| 19 | + m (meta vr) |
| 20 | + n (or name (:name m)) |
| 21 | + arglists (:arglists m) |
| 22 | + protocol (:protocol m)] |
| 23 | + (when-not vr |
| 24 | + (throw (IllegalArgumentException. (str "Don't recognize " sym)))) |
| 25 | + (when (:macro m) |
| 26 | + (throw (IllegalArgumentException. |
| 27 | + (str "Calling import-fn on a macro: " sym)))) |
28 | 28 |
|
29 |
| - `(let [vr# (resolve '~sym)] |
30 |
| - (def ~(with-meta n {:protocol protocol}) (deref vr#)) |
31 |
| - (alter-meta! (var ~n) merge (dissoc (meta vr#) :name)) |
32 |
| - (link-vars vr# (var ~n)) |
33 |
| - vr#)))) |
| 29 | + `(let [vr# (resolve '~sym)] |
| 30 | + (def ~(with-meta n {:protocol protocol}) (deref vr#)) |
| 31 | + (alter-meta! (var ~n) merge (dissoc (meta vr#) :name)) |
| 32 | + (link-vars vr# (var ~n)) |
| 33 | + vr#)))) |
34 | 34 |
|
35 | 35 | (defmacro import-macro
|
36 | 36 | "Given a macro in another namespace, defines a macro with the same
|
37 | 37 | name in the current namespace. Argument lists, doc-strings, and
|
38 | 38 | original line-numbers are preserved."
|
39 | 39 | ([sym]
|
40 |
| - `(import-macro ~sym nil)) |
| 40 | + `(import-macro ~sym nil)) |
41 | 41 | ([sym name]
|
42 |
| - (let [vr (resolve sym) |
43 |
| - m (meta vr) |
44 |
| - n (or name (with-meta (:name m) {})) |
45 |
| - arglists (:arglists m)] |
46 |
| - (when-not vr |
47 |
| - (throw (IllegalArgumentException. (str "Don't recognize " sym)))) |
48 |
| - (when-not (:macro m) |
49 |
| - (throw (IllegalArgumentException. |
50 |
| - (str "Calling import-macro on a non-macro: " sym)))) |
51 |
| - `(let [vr# (resolve '~sym)] |
52 |
| - (def ~n (deref vr#)) |
53 |
| - (alter-meta! (var ~n) merge (dissoc (meta vr#) :name)) |
54 |
| - (.setMacro (var ~n)) |
55 |
| - (link-vars vr# (var ~n)) |
56 |
| - vr#)))) |
| 42 | + (let [vr (resolve sym) |
| 43 | + m (meta vr) |
| 44 | + n (or name (with-meta (:name m) {})) |
| 45 | + arglists (:arglists m)] |
| 46 | + (when-not vr |
| 47 | + (throw (IllegalArgumentException. (str "Don't recognize " sym)))) |
| 48 | + (when-not (:macro m) |
| 49 | + (throw (IllegalArgumentException. |
| 50 | + (str "Calling import-macro on a non-macro: " sym)))) |
| 51 | + `(let [vr# (resolve '~sym)] |
| 52 | + (def ~n (deref vr#)) |
| 53 | + (alter-meta! (var ~n) merge (dissoc (meta vr#) :name)) |
| 54 | + (.setMacro (var ~n)) |
| 55 | + (link-vars vr# (var ~n)) |
| 56 | + vr#)))) |
57 | 57 |
|
58 | 58 | (defmacro import-def
|
59 | 59 | "Given a regular def'd var from another namespace, defined a new var with the
|
60 | 60 | same name in the current namespace."
|
61 | 61 | ([sym]
|
62 |
| - `(import-def ~sym nil)) |
| 62 | + `(import-def ~sym nil)) |
63 | 63 | ([sym name]
|
64 |
| - (let [vr (resolve sym) |
65 |
| - m (meta vr) |
66 |
| - n (or name (:name m)) |
67 |
| - n (with-meta n (if (:dynamic m) {:dynamic true} {})) |
68 |
| - nspace (:ns m)] |
69 |
| - (when-not vr |
70 |
| - (throw (IllegalArgumentException. (str "Don't recognize " sym)))) |
71 |
| - `(let [vr# (resolve '~sym)] |
72 |
| - (def ~n (deref vr#)) |
73 |
| - (alter-meta! (var ~n) merge (dissoc (meta vr#) :name)) |
74 |
| - (link-vars vr# (var ~n)) |
75 |
| - vr#)))) |
| 64 | + (let [vr (resolve sym) |
| 65 | + m (meta vr) |
| 66 | + n (or name (:name m)) |
| 67 | + n (with-meta n (if (:dynamic m) {:dynamic true} {})) |
| 68 | + nspace (:ns m)] |
| 69 | + (when-not vr |
| 70 | + (throw (IllegalArgumentException. (str "Don't recognize " sym)))) |
| 71 | + `(let [vr# (resolve '~sym)] |
| 72 | + (def ~n (deref vr#)) |
| 73 | + (alter-meta! (var ~n) merge (dissoc (meta vr#) :name)) |
| 74 | + (link-vars vr# (var ~n)) |
| 75 | + vr#)))) |
| 76 | + |
| 77 | +(defn- unravel* [x] |
| 78 | + (if (sequential? x) |
| 79 | + (->> x |
| 80 | + rest |
| 81 | + (mapcat unravel*) |
| 82 | + (map |
| 83 | + #(symbol |
| 84 | + (str (first x) |
| 85 | + (when-let [n (namespace %)] |
| 86 | + (str "." n))) |
| 87 | + (name %)))) |
| 88 | + [x])) |
| 89 | + |
| 90 | +(defn- unravel [x] |
| 91 | + (or (and (sequential? x) |
| 92 | + (let [[ns refer-kw refers rename-kw renames] x] |
| 93 | + (when (and (= :refer refer-kw) |
| 94 | + (sequential? refers) |
| 95 | + (or (and (nil? rename-kw) (nil? renames)) |
| 96 | + (and (= :rename rename-kw) (map? renames)))) |
| 97 | + (map #(with-meta (symbol (str ns) (name %)) {:name (get renames %)}) |
| 98 | + refers)))) |
| 99 | + (unravel* x))) |
76 | 100 |
|
77 | 101 | (defmacro import-vars
|
78 | 102 | "Imports a list of vars from other namespaces."
|
79 | 103 | [& syms]
|
80 |
| - (let [unravel (fn unravel [x] |
81 |
| - (if (sequential? x) |
82 |
| - (->> x |
83 |
| - rest |
84 |
| - (mapcat unravel) |
85 |
| - (map |
86 |
| - #(symbol |
87 |
| - (str (first x) |
88 |
| - (when-let [n (namespace %)] |
89 |
| - (str "." n))) |
90 |
| - (name %)))) |
91 |
| - [x])) |
92 |
| - syms (mapcat unravel syms)] |
| 104 | + (let [syms (mapcat unravel syms)] |
93 | 105 | `(do
|
94 | 106 | ~@(map
|
95 | 107 | (fn [sym]
|
96 | 108 | (let [vr (resolve sym)
|
97 |
| - m (meta vr)] |
| 109 | + m (meta vr) |
| 110 | + ?name (-> sym meta :name)] |
98 | 111 | (cond
|
99 |
| - (nil? vr) `(throw (ex-info (format "`%s` does not exist" '~sym) {})) |
100 |
| - (:macro m) `(import-macro ~sym) |
101 |
| - (:arglists m) `(import-fn ~sym) |
102 |
| - :else `(import-def ~sym)))) |
| 112 | + (nil? vr) `(throw (ex-info (format "`%s` does not exist" '~sym) {})) |
| 113 | + (:macro m) `(import-macro ~sym ~?name) |
| 114 | + (:arglists m) `(import-fn ~sym ~?name) |
| 115 | + :else `(import-def ~sym ~?name)))) |
103 | 116 | syms))))
|
0 commit comments