On Mon, Feb 13, 2012 at 5:16 PM, James <jegathi...@gmail.com> wrote: > Hi, > > I am new to clojure and I am very excited about learning the > language. I have a question about replacing an element in a list. I > have elements that look like this : > > {:id G__781, :value 1} > > The list looks like this: > > ({:id G__821, :value 1} {:id G__820, :value 1} {:id G__819, :value 1} > {:id G__818, :value 1} {:id G__817, :value 1}) > > I want to update an element in the list by conjoining a new list with > an updated element. For example, I'll update the head of the list: > ({:id G__821, :value 10} {:id G__820, :value 1} {:id G__819, :value 1} > {:id G__818, :value 1} {:id G__817, :value 1}) > > My update code (it really builds a new list with and replaces the > updated element) looks like this: > > (defn update-id-list [id-list new-id new-id-list] > (doseq[old-id id-list > new-id-list (conj new-id-list (choose-id old-id new-id) )] > (println "New List " new-id-list)) new-id-list) > > (defn choose-id[old-id new-id] > (if (= (:id old-id) (:id new-id)) new-id old-id)) > > This doesn't work. It never conjoin's elements and ultimately returns > an empty list. I've tried using various other methods but I keep > going in circles. > > Any ideas why this wouldn't work?
Functions like conj create and return a new list, rather than modify the original in-place. You'd need to change your doseq to something like: (for [old-id id-list] (choose-id old-id new-id)) I'd also use better names, perhaps (for [old-entry entry-list] (choose-entry old-entry new-entry)) But for this sort of job you might be better off using a larger map: {G__821 {:id G__821 :value 1} G__820 {:id G__820 :value 1} ... } (assoc entry-map old-id new-entry) e.g. (assoc entry-map G__821 {:id G__821 :value 10}) or even (update-in entry-map [id :value] (constantly new-value)) e.g. (update-in entry-map [G__821 :value] (constantly 10)) If you actually transform the old value with a function to get the new one, so much the better: (update-in entry-map [G__821 :value] #(* 10 %)) etc. Incidentally, are all of these symbols G__xxx defined somewhere? You might want keywords or strings instead, to avoid having to quote them to avoid errors. -- 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