On Thu, Nov 19, 2009 at 12:39 PM, Krukow <karl.kru...@gmail.com> wrote: > On Nov 19, 12:01 am, samppi <rbysam...@gmail.com> wrote: >> Question: are the general mechanisms for accessing and setting fields >> their keywords and assoc respectively: >> (deftype Bar [a b c d e]) >> (def b (Bar 1 2 3 4 5)) >> (:c b) >> (def c (assoc b :e 2)) >> Does (:c b) and (assoc b :e 2) take advantage of Bar's field >> information? Is it any faster than using an array map? Are there any >> equivalents to struct maps' accessor functions?
My understanding is that if you have (:c b) somewhere in your code, and "b" is always an object of the same deftype with a field "c", you're getting Java field-speed access (once hotspot has done what it does). Yes, that's faster than array map lookup. It's even faster than struct map accessor function lookup. > You can use the ability to implement interfaces, specifically > automatic support for IPersistentMap: > > ser=> (deftype Bar [a b] [clojure.lang.IPersistentMap]) > #'user/Bar > user=> (assoc (Bar 1 2) :a 42) > #:Bar{:a 42, :b 2} > user=> > > I have a question here, though: what is this? > > ser=> (assoc (Bar 1 2) :c 42) > #:Bar{:a 1, :b 2, :c 42} > user=> #:Bar{:a 1, :b 2, :c 42} > > Is it a "Bar" with field-speed access to :a and :b and map-speed > access to :c? Yes, I think that's correct. > Also can I assume that > > (assoc (Bar 1 2) :a 42) > #:Bar{:a 42, :b 2} > > will share structure with the (Bar 1 2) and still has fast access > to :a? Is the assoc function using that :a is a field? There will be no shared structure between your two Bar object. That is, the reference to 2 (or the value 2 itself if it were a primitive) will be copied to the new object. > I guess I am just asking if the performance guarantees are those I > would expect of Clojure (i.e., "too fast" ;-)) This is definitely still too fast. In fact, it keeps getting worse. --Chouser -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en