Key order of literal maps
Hey everyone, I'm busy implementing a macro whose usage looks like this: (defentity Person {:name {:type String :validator name-validator} :id-number {:type String :validator id-number-validator} :height{:type Float :default 0.0} :weight{:type Float :default 0.0} :bmi {:type Float :internal true}}) The macro generates a defrecord like so: (defrecord Person [name id-number height weight bmi]) Which can later be used in the application like this: (Person. David 123 1 2 3) Obviously the argument order is important. So my question is: Can I rely on (keys some-literal-map) always returning the keys in the order they were defined in the literal map? In my experiment, a map literal will create a PersistentArrayMap which I understand has sorted keys. Can someone confirm that this is reliable (e.g. across implementations?) Thanks! David -- 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
Re: Key order of literal maps
Keys from literal maps aren't sorted; you need a sorted map. user= (keys {:z 1 :f 2 :a 0}) (:z :a :f) user= (keys (sorted-map :z 1 :f 2 :a 0)) (:a :f :z) On May 3, 4:08 am, David Jagoe davidja...@gmail.com wrote: Hey everyone, I'm busy implementing a macro whose usage looks like this: (defentity Person {:name {:type String :validator name-validator} :id-number {:type String :validator id-number-validator} :height {:type Float :default 0.0} :weight {:type Float :default 0.0} :bmi {:type Float :internal true}}) The macro generates a defrecord like so: (defrecord Person [name id-number height weight bmi]) Which can later be used in the application like this: (Person. David 123 1 2 3) Obviously the argument order is important. So my question is: Can I rely on (keys some-literal-map) always returning the keys in the order they were defined in the literal map? In my experiment, a map literal will create a PersistentArrayMap which I understand has sorted keys. Can someone confirm that this is reliable (e.g. across implementations?) Thanks! David -- 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
Re: Key order of literal maps
On May 3, 2011, at 7:08 AM, David Jagoe wrote: Can I rely on (keys some-literal-map) always returning the keys in the order they were defined in the literal map? In general, the key order is not guaranteed, but an array-map will maintain the insertion order of the keys. Use the array-map function to create one. There's a bit more info here: http://clojuredocs.org/clojure_core/clojure.core/array-map An array-map maintains the insertion order of the keys. Look up is linear, which is not a problem for small maps (say less than 10 keys). If your map is large, you should use hash-map instead. When you assoc onto an existing array-map, the result is a new array-map with the new key as the first key. The rest of the keys are in the same order as the original. Functions such as seq and keys will respect the key order. Note that assoc will decide to return a hash-map if the result is too big to be efficient. For your specific purpose, I would be careful about using a map as an entity specification. If the order is significant, a vector of field specifiers would be better. Instead of taking a map as the second argument to defentity, you could make it variadic like (defmacro defentity [ent specs] ...). -- 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
Re: Key order of literal maps
Thanks for the responses. On 3 May 2011 17:39, Steve Miner stevemi...@gmail.com wrote: On May 3, 2011, at 7:08 AM, David Jagoe wrote: For your specific purpose, I would be careful about using a map as an entity specification. If the order is significant, a vector of field specifiers would be better. Instead of taking a map as the second argument to defentity, you could make it variadic like (defmacro defentity [ent specs] ...). Yes, that looks like the solution. Thanks again. David -- 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 -- 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