summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/clj/clojure/core_deftype.clj29
1 files changed, 13 insertions, 16 deletions
diff --git a/src/clj/clojure/core_deftype.clj b/src/clj/clojure/core_deftype.clj
index c30c8829..f74af8ab 100644
--- a/src/clj/clojure/core_deftype.clj
+++ b/src/clj/clojure/core_deftype.clj
@@ -49,13 +49,22 @@
`(.withMeta [~'m] (new ~tagname ~@(replace {'__meta 'm} fields))))]
[i m]))
(ilookup [[i m]]
- (if (implement? clojure.lang.ILookup)
- [(conj i 'clojure.lang.ILookup)
+ (if (not (methodname-set '.valAt))
+ [(conj i 'clojure.lang.ILookup 'clojure.lang.IKeywordLookup)
(conj m `(.valAt [k#] (.valAt ~'this k# nil))
`(.valAt [k# else#]
(case k# ~@(mapcat (fn [fld] [(keyword fld) fld])
base-fields)
- (get ~'__extmap k# else#))))]
+ (get ~'__extmap k# else#)))
+ `(.getLookupThunk [k#]
+ (case k#
+ ~@(mapcat
+ (fn [fld]
+ (let [cstr (str (clojure.core/name classname) "$__lookup__" (clojure.core/name fld))]
+ [(keyword fld)
+ `(-> ~cstr (Class/forName) (.newInstance))]))
+ base-fields)
+ nil)))]
[i m]))
(idynamictype [[i m]]
[(conj i 'clojure.lang.IDynamicType)
@@ -65,18 +74,6 @@
`(.getDynamicField [k# else#]
(condp identical? k# ~@(mapcat (fn [fld] [(keyword fld) fld]) base-fields)
(get ~'__extmap k# else#))))])
- (ikeywordlookup [[i m]]
- [(conj i 'clojure.lang.IKeywordLookup)
- (conj m
- `(.getLookupThunk [k#]
- (case k#
- ~@(mapcat
- (fn [fld]
- (let [cstr (str (clojure.core/name classname) "$__lookup__" (clojure.core/name fld))]
- [(keyword fld)
- `(-> ~cstr (Class/forName) (.newInstance))]))
- base-fields)
- nil)))])
(imap [[i m]]
(if (and (interface-set clojure.lang.IPersistentMap) (not (methodname-set '.assoc)))
[i
@@ -103,7 +100,7 @@
(new ~tagname ~@(remove #{'__extmap} fields)
(not-empty (dissoc ~'__extmap k#))))))]
[i m]))]
- (let [[i m] (-> [interfaces methods] eqhash iobj ilookup imap ikeywordlookup idynamictype)]
+ (let [[i m] (-> [interfaces methods] eqhash iobj ilookup imap idynamictype)]
`(deftype* ~tagname ~classname ~(conj hinted-fields '__meta '__extmap)
:implements ~(vec i)
~@m)))))