diff options
author | Rich Hickey <richhickey@gmail.com> | 2009-11-14 09:07:17 -0500 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2009-11-14 09:07:17 -0500 |
commit | bafa0309ffc6aa9593c31234d0156cd7fd8b84b1 (patch) | |
tree | bc99aef19af7fd7389d204f11d62fdb8f5c605e7 | |
parent | 1efc49548b1f07681651ae2907276b912e05c1b1 (diff) |
tie ILookup and IKeywordLookup to valAt
-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))))) |