Regards,
Heinz
Sorry I mixed arguments, it should be (update-in {1 2} [] (constantly {2 3}))
>
> 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}
In opposite of how it works:
user> (update-in {1 2} [] assoc 1 3)
{nil {1 3}, 1 2}
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/
>
> I agree with the spirit of your argument, but not your
> implementation:
>
> (update-in* {nil 2} [nil] (constantly 3))
> ;=> 3
As so often Chouser, you are of cause totally right :). I just realized the flaw when I was about to open a ticket but you were faster ;) well this are good news so since I don't have a CA signed yet (actually I do just not send it :P) so one could use your code as a fix.
Regards,
Heinz