diff options
-rw-r--r-- | src/clj/clojure/core_deftype.clj | 29 |
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))))) |