Hi Roelof,

ClojureDocs.org  <http://clojuredocs.org/>is also a great tool for figuring 
out how to use a specific function. It presents examples created 
by the community, which are quite helpful when learning the language.

Here's the entry for the assoc <http://clojuredocs.org/clojure.core/assoc>
function. 

Hope it helps,

Juan

On Wednesday, October 29, 2014 9:53:59 AM UTC-3, Roelof Wobben wrote:
>
> Thanks all, 
>
> It clear to me that I have to read the explanation or the right wiki page 
> more carefully.
>
> I tried all of them and they all give the same answer : 
> {:title "zbook", :authors [{:name "James"} {:name "Joe"}]} 
>
> Roelof
>
>
> Op woensdag 29 oktober 2014 13:34:32 UTC+1 schreef François Rey:
>
>>  (oops my earlier message isn't quite right, here's the correct one)
>>
>> You also need to clarify your intention: are you adding an author to a 
>> list of authors, or setting the single author?
>> I suppose the first, but then you need to be clear on what the list of 
>> authors is. 
>> In idiomatic clojure you'll want it to be a vector of authors, so if an 
>> author is a map like {:name "Gerald J. Sussman"}, then :authors must be 
>> associated to a vector of maps.
>> Also bear in mind that assoc is geared towards associative data 
>> structures such as maps, while conj is geared towards sequential data 
>> structures such as vectors.
>> That being said, you can still use assoc on vectors (indices are the 
>> keys) and use conj on maps (with a vector in the form of [key value]), but 
>> that's polymorphism convenience, not idiomatic.
>> In the end add to a new author, you need to do:
>> (assoc book :authors (conj (get book :authors) new-author))
>> Which can also be made more idiomatic as already mentioned:
>> (update-in book [:authors] assoc new-author)
>> The twisted way of doing it would be:
>> (conj book [:authors (conj (:authors book) new-author)])
>>
>> Try this in a REPL:
>>
>> (def book {:title "zbook" :authors [{:name "James"}]})
>> (def new-author {:name "Joe"})
>> (assoc book :authors (conj (get book :authors) new-author))
>> (update-in book [:authors] conj new-author)
>> (conj book [:authors (conj (:authors book) new-author)])
>>
>>
>>
>>
>> On 29/10/14 12:20, Roelof Wobben wrote:
>>  
>>  Thanks James, 
>>
>>  But how do I use assoc with it 
>>
>>  I tried this : 
>>
>>  (defn add-author [book new-author]
>>   (assoc book (conj (book :authors) new-author)))
>>
>>  but then I see this message : 
>>
>>  
>> ArityException Wrong number of args (2) passed to: core$assoc  
>> clojure.lang.AFn.throwArity (AFn.java:437)         
>>
>>  Roelof
>>
>>
>> Op woensdag 29 oktober 2014 12:08:35 UTC+1 schreef James Reeves:
>>
>>>  On 29 October 2014 11:01, Roelof Wobben <rwo...@hotmail.com> wrote: 
>>>>
>>>>  For a exercise I have to add something to the end of a existing map. 
>>>>
>>>>  So I thought this would work : 
>>>>
>>>>  (defn add-author [book new-author]
>>>>   (assoc book (conj :authors new-author)))
>>>>  
>>>
>>>  Take a look at that conj expression on its own:
>>>
>>>      (conj :authors new-author)
>>>
>>>  You're trying to conjoin "new-author" onto the keyword :authors, but 
>>> keywords aren't collections. That's what the error means. It's saying that 
>>> it expected a collection, but you've supplied a keyword instead.
>>>
>>>  What you want is:
>>>
>>>      (conj (get book :authors) new-author)
>>>
>>>  Which can also be written:
>>>
>>>      (conj (book :authors) new-author)
>>>
>>>      (conj (:authors book) new-author)
>>>  
>>>  These two expressions are shortcuts for the above "get" function. They 
>>> work because maps and keywords can act as functions.
>>>
>>>  - James
>>>   
>>  -- 
>> 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
>> 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
>> 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.
>> For more options, visit https://groups.google.com/d/optout.
>>
>>
>> 

-- 
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