On Thursday, March 21, 2013 5:21:53 PM UTC+1, Ryan wrote:

> Thanks Marko. I do have couple more q's for you just to ensure I got 
> everything right:
>
> (comp keyset-b key-fn)
>> This results in a function that first applies *key-fn*, then *keyset-b*. 
>> So it's like #(keyset-b (key-fn %)). Let's call this function *predicate*
>> .
>
>
> 1. What exactly happens when an item is passed to #(keyset-b (key-fn %)) ? 
> Does 
> keyset-b looks up itself (because collections are functions) for the item 
> which contains *:id X *and returns true/false?
>

It returns the argument if it contains it, and otherwise 
nil.<http://clojure.org/data_structures#Data%20Structures-Sets>
 

> 2. Isn't it more idiomatic to write #((key-fn %) keyset-b) ?
>

No, because it doesn't work :) An arbitrary object cannot be applied as a 
function.
 

> 3. Does remove loops list-a internally and applies the predicate to each 
> item? (if the answer is no my head will definitely explode)
>

*remove* is just like *filter*, only with reversed logic. Its 
implementation in fact is literally

(filter (complement pred) 
coll))<http://clojuredocs.org/clojure_core/1.2.0/clojure.core/remove>
 

> On Thursday, March 21, 2013 6:09:42 PM UTC+2, Marko Topolnik wrote:
>
>> Personal preference. It causes less mental load because it more obviously 
>> spells out what you are doing.
>>
>> On Thursday, March 21, 2013 4:58:08 PM UTC+1, Ryan wrote:
>>>
>>> Thanks a lot Marko. Much better now :)
>>>
>>> I also wanted to ask you why did you mention in a previous post that you 
>>> prefer using *remove *than *filter + complement*. Is there a reason for 
>>> this or just a personal preference?
>>>
>>> Ryan
>>>
>>> On Thursday, March 21, 2013 5:37:33 PM UTC+2, Marko Topolnik wrote:
>>>>
>>>> First we build a set of all the keys in *list-b*: 
>>>>
>>>> (into #{} (map key-fn list-b))
>>>>
>>>> Let's call that set *keyset-b. *Then we use *keyset-b* as a function 
>>>> which returns truthy (non-nil) for any key that is contained in it, and 
>>>> compose it with our *key-fn*:
>>>>
>>>> (comp keyset-b key-fn)
>>>>
>>>> This results in a function that first applies *key-fn*, then *keyset-b*. 
>>>> So it's like #(keyset-b (key-fn %)). Let's call this function *
>>>> predicate*.
>>>>
>>>> Finally, we use *predicate* to *remove* any member of *list-a* for 
>>>> which it is truthy:
>>>>
>>>> (remove predicate list-a)
>>>>
>>>> -marko
>>>>
>>>> On Thursday, March 21, 2013 4:14:46 PM UTC+1, Ryan wrote:
>>>>
>>>>> Marko,
>>>>>
>>>>> Can you please do me a favor and break down the function you suggested 
>>>>> me? I understand partially how it works but I am having trouble to fully 
>>>>> get it.
>>>>>
>>>>> (remove (comp (into #{} (map key-fn list-b)) key-fn) list-a)
>>>>>>
>>>>>

-- 
-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to