I'll attempt an argument for returning the record's type in another way: I 
can always get a PersistentArrayMap from select-keys, if I want. Just add 
(into {} ...) to the chain. I cannot, however, retain the record type 
because select-keys *makes the decision for me*.

In other words, letting select-keys return the key/value pairs in the type 
I passed it, I retain control, rather than watching it be yanked from me.

(I also came across this thread because select-keys' return value surprised 
me. What's worse, though, there's no simple way to resolve it without 
re-introducing a constructor function in the middle of my flow.)

On Sunday, November 3, 2013 2:46:40 PM UTC-7, dcj wrote:
>
>
> On Nov 2, 2013, at 9:27 AM, Mark Engelberg <mark.en...@gmail.com 
> <javascript:>> wrote:
>
> I seem to be a relatively lone voice thinking it makes sense to preserve 
> the type of the map, and honestly, I'm not going to lose any sleep if this 
> patch is never actually implemented, but here's my two cents on the 
> "optimal" design for records.
>
> Earlier in the thread, I mentioned two mental models about how select-keys 
> works.  Even though the actual implementation involves starting from an 
> empty map and building back up, I think the behavior of select-keys should 
> mimic the mental model of discarding irrelevant keys.
>
> The two mental models predict somewhat differently what would happen when 
> working with records.  Records can hold additional keys.  So imagine 
> someone dumps a whole lot of additional keys, and then wants to "recover" 
> the original, true record, by calling select-keys with the original keys in 
> the record.  I think this is a use case worth supporting.  This corresponds 
> to the mental model of discarding unwanted keys.
>
> To implement this for records:
> If any of the original record keys do not appear in the selected keys, 
> then, as with dissoc, we must revert back to a map as there is no valid way 
> to represent this as a record.
> Otherwise, maintain the record type -- the core record contents are 
> preserved, and essentially you only need to call select-keys only on the 
> extended map of extra keys stored in the record.
>
>
> I agree 100% with Mark’s comments above.
> This is exactly the model I would expect select-keys to have.
>
> Conceptually, this is how I imagine select-keys should work:
>
> (defn select-keys++
>   "Returns a new map of the same (hashed/sorted) type,
>   that contains only those entries whose key is in keyseq"
>   [map keyseq]
>   (apply dissoc 
>              map 
>              (clojure.set/difference (set (keys map))
>                                                  (set keyseq))))
>
>
> I am not saying that this would be the best , or even a good, 
> implementation.
>
> Like Mark, I am not going to lose any sleep about this either, but I was 
> using Mark’s data.priority-maps the other day,
> did a select-keys to winnow down my priority-map, and was surprised by the 
> result.
> Perhaps I should not have been surprised….
> In preparing this email, I carefully re-read the doc strings for both 
> dissoc and select keys:
>
> (defn dissoc
>   "dissoc[iate]. Returns a new map of the same (hashed/sorted) type,
>   that does not contain a mapping for key(s).”
>
> (defn select-keys
>   "Returns a map containing only those entries in map whose key is in keys"
>
>
> Clearly dissoc makes the promise to return a map of the same type that 
> select-keys doesn’t.
> A potential non-code change to select-keys might be to emphasize that the 
> return map will be
> a hash-map, regardless of the kind/type of input map.
>
> Don
>
>
>
> On Sat, Nov 2, 2013 at 8:49 AM, Andy Fingerhut <andy.fi...@gmail.com 
> <javascript:>> wrote:
>
>> I attached another patch to the ticket.  It builds up the answer from the 
>> empty map {} if the argument is a record (as the current select-keys does), 
>> but from (empty map) if it is not a record, so it will preserve sortedness 
>> of the argument.  Not sure if there are any other cases that are a problem, 
>> or if it does what everyone would expect, but it should be closer.
>>
>>     http://dev.clojure.org/jira/browse/CLJ-1287
>>
>> Andy
>>
>>
>> On Sat, Nov 2, 2013 at 6:07 AM, Alex Miller <al...@puredanger.com 
>> <javascript:>> wrote:
>>
>>> > One other point:
>>> > Sometimes people use sorted maps and array maps specifically for 
>>> scenarios in which the keys are not hashable and therefore hash maps would 
>>> not apply.  Dumping the contents into a regular map in such cases doesn't 
>>> make much sense.
>>>
>>> Everything is hashable, not sure what a non-hashable key means. Array 
>>> maps use the hash of the key to determine the array bucket. If you get the 
>>> hash code of a sorted map, it will get the hash of all keys and values.
>>>
>>> --
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Clojure" group.
>>> To post to this group, send email to clo...@googlegroups.com 
>>> <javascript:>
>>> Note that posts from new members are moderated - please be patient with 
>>> your first post.
>>> To unsubscribe from this group, send email to
>>> clojure+u...@googlegroups.com <javascript:>
>>> 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 unsubscribe from this group and stop receiving emails from it, send 
>>> an email to clojure+u...@googlegroups.com <javascript:>.
>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>
>>
>>
>> -- 
>> -- 
>> You received this message because you are subscribed to the Google
>> Groups "Clojure" group.
>> To post to this group, send email to clo...@googlegroups.com 
>> <javascript:>
>> Note that posts from new members are moderated - please be patient with 
>> your first post.
>> To unsubscribe from this group, send email to
>> clojure+u...@googlegroups.com <javascript:>
>> 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 unsubscribe from this group and stop receiving emails from it, send an 
>> email to clojure+u...@googlegroups.com <javascript:>.
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>
>
> -- 
> -- 
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clo...@googlegroups.com <javascript:>
> Note that posts from new members are moderated - please be patient with 
> your first post.
> To unsubscribe from this group, send email to
> clojure+u...@googlegroups.com <javascript:>
> 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 unsubscribe from this group and stop receiving emails from it, send an 
> email to clojure+u...@googlegroups.com <javascript:>.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>

-- 
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 unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to