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