|
36 | 36 | #?(:clj |
37 | 37 | (deftype SciRecord [rec-name |
38 | 38 | type |
39 | | - var ext-map |
| 39 | + basis-fields |
| 40 | + var |
| 41 | + ext-map |
40 | 42 | ^:unsynchronized-mutable my_hash |
41 | 43 | ^:unsynchronized-mutable my_hasheq] |
42 | 44 | clojure.lang.IRecord ;; marker interface |
|
65 | 67 | (meta ext-map)) |
66 | 68 | (withMeta [_ m] |
67 | 69 | (SciRecord. |
68 | | - rec-name type var (with-meta ext-map m) 0 0)) |
| 70 | + rec-name type var basis-fields (with-meta ext-map m) 0 0)) |
69 | 71 |
|
70 | 72 | clojure.lang.ILookup |
71 | 73 | (valAt [_this k] |
|
94 | 96 | (iterator [_this] |
95 | 97 | (clojure.lang.RT/iter ext-map)) |
96 | 98 | (assoc [_this k v] |
97 | | - (SciRecord. rec-name type var (assoc ext-map k v) 0 0)) |
| 99 | + (SciRecord. rec-name type basis-fields var (assoc ext-map k v) 0 0)) |
98 | 100 | (without [_this k] |
99 | | - (SciRecord. rec-name type var (dissoc ext-map k) 0 0)) |
| 101 | + (if (contains? basis-fields k) |
| 102 | + (dissoc ext-map k) |
| 103 | + (SciRecord. rec-name type basis-fields var (dissoc ext-map k) 0 0))) |
100 | 104 |
|
101 | 105 | java.util.Map |
102 | 106 | java.io.Serializable |
|
144 | 148 | #?(:cljs |
145 | 149 | (deftype SciRecord [rec-name |
146 | 150 | type |
| 151 | + basis-fields |
147 | 152 | var ext-map |
148 | 153 | ^:mutable my_hash] |
149 | 154 | IRecord ;; marker interface |
150 | 155 |
|
151 | 156 | ICloneable |
152 | 157 | (-clone [_] |
153 | | - (new SciRecord rec-name type var ext-map my_hash)) |
| 158 | + (new SciRecord rec-name type basis-fields var ext-map my_hash)) |
154 | 159 |
|
155 | 160 | IHash |
156 | 161 | (-hash [_] |
|
177 | 182 | IWithMeta |
178 | 183 | (-with-meta [_ m] |
179 | 184 | (new SciRecord |
180 | | - rec-name type var (with-meta ext-map m) my_hash)) |
| 185 | + rec-name type basis-fields var (with-meta ext-map m) my_hash)) |
181 | 186 |
|
182 | 187 | ILookup |
183 | 188 | (-lookup [_ k] |
|
201 | 206 | (-contains-key? [_ k] |
202 | 207 | (-contains-key? ext-map k)) |
203 | 208 | (-assoc [_ k v] |
204 | | - (new SciRecord rec-name type var (assoc ext-map k v) nil)) |
| 209 | + (new SciRecord rec-name type basis-fields var (assoc ext-map k v) nil)) |
205 | 210 |
|
206 | 211 | IMap |
207 | 212 | (-dissoc [_ k] |
208 | | - (new SciRecord rec-name type var (dissoc ext-map k) nil)) |
| 213 | + (if (contains? basis-fields k) |
| 214 | + (dissoc ext-map k) |
| 215 | + (new SciRecord rec-name type basis-fields var (dissoc ext-map k) nil))) |
209 | 216 |
|
210 | 217 | ISeqable |
211 | 218 | (-seq [_] |
|
242 | 249 | (defmethod print-method SciRecord [v w] |
243 | 250 | (-sci-print-method v w))) |
244 | 251 |
|
245 | | -#?(:clj (defn ->record-impl [rec-name type var m] |
246 | | - (SciRecord. rec-name type var m 0 0)) |
247 | | - :cljs (defn ->record-impl [rec-name type var m] |
248 | | - (SciRecord. rec-name type var m nil))) |
| 252 | +#?(:clj (defn ->record-impl [rec-name type basis-fields var m] |
| 253 | + (SciRecord. rec-name type basis-fields var m 0 0)) |
| 254 | + :cljs (defn ->record-impl [rec-name type basis-fields var m] |
| 255 | + (SciRecord. rec-name type basis-fields var m nil))) |
249 | 256 |
|
250 | 257 | (defn defrecord [[_fname & _ :as form] _ record-name fields & raw-protocol-impls] |
251 | 258 | (let [ctx (store/get-ctx)] |
|
332 | 339 | ([~@arg-syms] |
333 | 340 | (~constructor-fn-sym ~@arg-syms nil nil)) |
334 | 341 | ([~@arg-syms meta# ext#] |
335 | | - (sci.impl.records/->record-impl '~rec-type ~rec-type (var ~record-name) |
| 342 | + (sci.impl.records/->record-impl '~rec-type |
| 343 | + ~rec-type |
| 344 | + (set (map keyword ~keys)) |
| 345 | + (var ~record-name) |
336 | 346 | (cond-> (zipmap ~keys ~arg-syms) |
337 | | - ext# (merge ext#) |
338 | | - meta# (with-meta meta#))))) |
| 347 | + ext# (merge ext#) |
| 348 | + meta# (with-meta meta#))))) |
339 | 349 | (defn ~factory-fn-sym |
340 | 350 | ([~@arg-syms] |
341 | 351 | (~constructor-fn-sym ~@arg-syms nil nil))) |
342 | 352 | (defn ~map-factory-sym [m#] |
343 | | - (sci.impl.records/->record-impl '~rec-type ~rec-type (var ~record-name) (merge '~nil-map m#))) |
| 353 | + (sci.impl.records/->record-impl '~rec-type |
| 354 | + ~rec-type |
| 355 | + (set (map keyword ~keys)) |
| 356 | + (var ~record-name) |
| 357 | + (merge '~nil-map m#))) |
344 | 358 | ~@protocol-impls |
345 | 359 | ~record-name))))) |
346 | 360 |
|
|
0 commit comments