diff options
author | Rich Hickey <richhickey@gmail.com> | 2010-04-05 17:52:55 -0400 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2010-04-05 17:52:55 -0400 |
commit | 54ab7bd6b6b2894923cc0a9333a5ea39738ae4f6 (patch) | |
tree | 104648a9f77038a96b4622181e7694e7988aa3ac /src/clj | |
parent | c733148ba0fb3ff7bbab133f5375422972e62d08 (diff) |
use reify for ILookupThunk impls in deftype
Diffstat (limited to 'src/clj')
-rw-r--r-- | src/clj/clojure/core_deftype.clj | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/src/clj/clojure/core_deftype.clj b/src/clj/clojure/core_deftype.clj index d8027302..8e13902a 100644 --- a/src/clj/clojure/core_deftype.clj +++ b/src/clj/clojure/core_deftype.clj @@ -149,13 +149,15 @@ (get ~'__extmap k# else#))) `(getLookupThunk [~'this 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)))] + ~@(let [gtarget (gensym) + hinted-target (with-meta gtarget {:tag tagname})] + (mapcat + (fn [fld] + [(keyword fld) + `(reify clojure.lang.ILookupThunk + (get [_ ~gtarget] (. ~hinted-target ~fld)))]) + base-fields)) + nil)))] [i m])) (idynamictype [[i m]] [(conj i 'clojure.lang.IDynamicType) |