On Fri, Jun 4, 2010 at 10:04 AM, Heinz N. Gies <he...@licenser.net> wrote:
>
> On Jun 4, 2010, at 14:11 , Heinz N. Gies wrote:
>
>>
>> On Jun 4, 2010, at 14:03 , Joost wrote:
>>
>>> On Jun 4, 1:42 pm, "Heinz N. Gies" <he...@licenser.net> wrote:
>>>> Sorry I mixed arguments, it should be (update-in {1 2} [] (constantly {2 
>>>> 3}))
>>>
>>> Yes, that gives {nil {2 3}, 1 2}
>>>
>>> You're not giving any key in the key list, so that is the reason
>>> there's a nil key now, and {2 3} is just the value that you give it,
>>> since that's what ((constantly {2 3}) nil) returns.
>>>
>>> Seems correct as far as the documentation of update-in is concerned.
>
>
> So for how I'd expect it to work:
>
> (defn update-in*
>  ([m [k & ks] f & args]
>   (if ks
>     (assoc m k (apply update-in* (get m k) ks f args))
>     (if k
>       (assoc m k (apply f (get m k) args))
>       (apply f  m args)))))
>
> user> (get-in {1 2} [])
> {1 2}
> user> (update-in* {1 2} [] assoc  1 3)
> {1 3}

I agree with the spirit of your argument, but not your
implementation:

  (update-in* {nil 2} [nil] (constantly 3))
  ;=> 3

Perhaps:

  (defn update-in*
    [m ks f & args]
    (if-let [[k & mk] ks]
        (if mk
        (assoc m k (apply update-in* (get m k) mk f args))
        (assoc m k (apply f (get m k) args)))
      (apply f m args)))

  (update-in* {nil 2} [nil] (constantly 3))
  ;=> {nil 3}

--Chouser
http://joyofclojure.com/

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

Reply via email to