Re: how do I evaluate this lazy sequence?
> I'm just a > bit amazed that you would go away and write clojure code to consume JSON > and all that, without realising that data-structures in Clojure are > immutable! That part is obvious enough, but I thought the new data structures returned from assoc were being handed to map which then, in turn, returned a new data structure where all values had been updated with the values from assoc. But clearly, I got the syntax badly wrong. On Sep 27, 2:21 pm, "Jim - FooBar();" wrote: > the 2 previous responses answered your question perfectly ...I'm just a > bit amazed that you would go away and write clojure code to consume JSON > and all that, without realising that data-structures in Clojure are > immutable! I think we can all agree they are *the* cornerstone of > Clojure. It is a bit alien at first but it does pay off in the long > run... If you absolutely need to stick with your code style (mutability > not-recommended in general) use a java HashMap instead... > > Jim > > ps: i recently used a cheshire without any problems :-) > > On 27/09/12 18:53, gaz jones wrote: > > > > > > > > > Couple of initial things, Clojure has immutable data structures so > > when you call for example 'assoc' it will return you a new map with > > the new values assoc'd. It will not mutate the original, so: > > > (let [foo {}] > > (assoc foo :a 1) > > (assoc foo :b 2) > > foo) > > > Will return {}. You need to do something like: > > > (-> {} > > (assoc :a 1) > > (assoc :b 2)) > > > => {:a 1 :b 2} > > > FYI, assoc takes multiple kvps: > > > (assoc {} :a 1 :b 2) > > > Also, to return valid JSON, you cannot simply call 'str' on the map. > > You need to use a library likehttps://github.com/dakrone/cheshireor > >https://github.com/clojure/data.jsonand encode the map as JSON. > > > Perhaps you could illustrate the data structure you are holding inside > > of @registry, and the structure of the JSON you would like to emit. > > Laziness is not an issue here. > > > On Thu, Sep 27, 2012 at 12:02 PM, larry google groups > > wrote: > >> I would like 2 types of advice: > > >> 1.) an answer to this specific question > > >> 2.) advice on how one is suppose to debug mysteries likes this > > >> I have a simple web app that serves some data (hopefully in JSON > >> format, but at the moment I will accept anything at all). The app uses > >> Ring and Moustache and outputs the data. > > >> We start with a simple atom: > > >> (def registry (atom {})) > > >> We put some data in this atom. And then we output it. But I have had > >> great difficulty getting anything to appear on the screen. Assuming > >> the problem was with the fact the main sequence was lazy, I added in > >> doall everywhere it made sense. But I still can not get anything to > >> work: > > >> (defn current-users [request] > >> "The default action of this app. Add new users to the registry, and > >> delete the ones that are more than 15 seconds old" > >> (let [this-users-params (:params request) > >> final-map-for-output {}] > >> (add-to-logged-in-registry this-users-params) > >> (remove-old-registrants) > >> (response (apply str (into {} > >> (doall > >> (map (fn [each-user-map] > >> (doall > >> (let [inner-details (second each- > >> user-map)] > >> (assoc final-map-for-output > >> "username" (get inner-details "username" "nothing found for user")) > >> (assoc final-map-for-output > >> "updated" (get inner-details "updated" "nothing found for updated")) > >> final-map-for-output))) > >> @registry))) > > >> The various variations I have tried on this have either given me a > >> blank white page or: > > >> {} > > >> Nothing else. > > >> I used to do simply: > > >> (response (apply str (doall @registry) > > >> This worked fine. But it did not output valid JSON, so I wanted to > >> change the format. But I have not been able to get anything to appear > >> on screen. > > >> Suggestions? > > >> -- > >> 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 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
Re: how do I evaluate this lazy sequence?
the 2 previous responses answered your question perfectly ...I'm just a bit amazed that you would go away and write clojure code to consume JSON and all that, without realising that data-structures in Clojure are immutable! I think we can all agree they are *the* cornerstone of Clojure. It is a bit alien at first but it does pay off in the long run... If you absolutely need to stick with your code style (mutability not-recommended in general) use a java HashMap instead... Jim ps: i recently used a cheshire without any problems :-) On 27/09/12 18:53, gaz jones wrote: Couple of initial things, Clojure has immutable data structures so when you call for example 'assoc' it will return you a new map with the new values assoc'd. It will not mutate the original, so: (let [foo {}] (assoc foo :a 1) (assoc foo :b 2) foo) Will return {}. You need to do something like: (-> {} (assoc :a 1) (assoc :b 2)) => {:a 1 :b 2} FYI, assoc takes multiple kvps: (assoc {} :a 1 :b 2) Also, to return valid JSON, you cannot simply call 'str' on the map. You need to use a library like https://github.com/dakrone/cheshire or https://github.com/clojure/data.json and encode the map as JSON. Perhaps you could illustrate the data structure you are holding inside of @registry, and the structure of the JSON you would like to emit. Laziness is not an issue here. On Thu, Sep 27, 2012 at 12:02 PM, larry google groups wrote: I would like 2 types of advice: 1.) an answer to this specific question 2.) advice on how one is suppose to debug mysteries likes this I have a simple web app that serves some data (hopefully in JSON format, but at the moment I will accept anything at all). The app uses Ring and Moustache and outputs the data. We start with a simple atom: (def registry (atom {})) We put some data in this atom. And then we output it. But I have had great difficulty getting anything to appear on the screen. Assuming the problem was with the fact the main sequence was lazy, I added in doall everywhere it made sense. But I still can not get anything to work: (defn current-users [request] "The default action of this app. Add new users to the registry, and delete the ones that are more than 15 seconds old" (let [this-users-params (:params request) final-map-for-output {}] (add-to-logged-in-registry this-users-params) (remove-old-registrants) (response (apply str (into {} (doall (map (fn [each-user-map] (doall (let [inner-details (second each- user-map)] (assoc final-map-for-output "username" (get inner-details "username" "nothing found for user")) (assoc final-map-for-output "updated" (get inner-details "updated" "nothing found for updated")) final-map-for-output))) @registry))) The various variations I have tried on this have either given me a blank white page or: {} Nothing else. I used to do simply: (response (apply str (doall @registry) This worked fine. But it did not output valid JSON, so I wanted to change the format. But I have not been able to get anything to appear on screen. Suggestions? -- 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 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
Re: how do I evaluate this lazy sequence?
Couple of initial things, Clojure has immutable data structures so when you call for example 'assoc' it will return you a new map with the new values assoc'd. It will not mutate the original, so: (let [foo {}] (assoc foo :a 1) (assoc foo :b 2) foo) Will return {}. You need to do something like: (-> {} (assoc :a 1) (assoc :b 2)) => {:a 1 :b 2} FYI, assoc takes multiple kvps: (assoc {} :a 1 :b 2) Also, to return valid JSON, you cannot simply call 'str' on the map. You need to use a library like https://github.com/dakrone/cheshire or https://github.com/clojure/data.json and encode the map as JSON. Perhaps you could illustrate the data structure you are holding inside of @registry, and the structure of the JSON you would like to emit. Laziness is not an issue here. On Thu, Sep 27, 2012 at 12:02 PM, larry google groups wrote: > I would like 2 types of advice: > > 1.) an answer to this specific question > > 2.) advice on how one is suppose to debug mysteries likes this > > I have a simple web app that serves some data (hopefully in JSON > format, but at the moment I will accept anything at all). The app uses > Ring and Moustache and outputs the data. > > We start with a simple atom: > > (def registry (atom {})) > > We put some data in this atom. And then we output it. But I have had > great difficulty getting anything to appear on the screen. Assuming > the problem was with the fact the main sequence was lazy, I added in > doall everywhere it made sense. But I still can not get anything to > work: > > (defn current-users [request] > "The default action of this app. Add new users to the registry, and > delete the ones that are more than 15 seconds old" > (let [this-users-params (:params request) > final-map-for-output {}] > (add-to-logged-in-registry this-users-params) > (remove-old-registrants) > (response (apply str (into {} > (doall > (map (fn [each-user-map] > (doall > (let [inner-details (second each- > user-map)] > (assoc final-map-for-output > "username" (get inner-details "username" "nothing found for user")) > (assoc final-map-for-output > "updated" (get inner-details "updated" "nothing found for updated")) > final-map-for-output))) >@registry))) > > The various variations I have tried on this have either given me a > blank white page or: > > {} > > Nothing else. > > I used to do simply: > > (response (apply str (doall @registry) > > This worked fine. But it did not output valid JSON, so I wanted to > change the format. But I have not been able to get anything to appear > on screen. > > Suggestions? > > -- > 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 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
Re: how do I evaluate this lazy sequence?
larry google groups writes: > We put some data in this atom. And then we output it. But I have had > great difficulty getting anything to appear on the screen. Assuming > the problem was with the fact the main sequence was lazy, I added in > doall everywhere it made sense. But I still can not get anything to > work: Your problem's here and has nothing to do with lazyness: > (let [inner-details (second each-user-map)] > (assoc final-map-for-output "username" (get inner-details > "username" "nothing found for user")) > (assoc final-map-for-output "updated" (get inner-details > "updated" "nothing found for updated")) > final-map-for-output))) assoc (and all clojure collection functions) doesn't modify the given map but it returns a new version of the given map with the new association. You simply don't use it. Maybe you want something like this in case you want to output pairs of "username"/inner-details, and "updated"/inner-details pairs. --8<---cut here---start->8--- (defn current-users [request] "The default action of this app. Add new users to the registry, and delete the ones that are more than 15 seconds old" (let [this-users-params (:params request)] (add-to-logged-in-registry this-users-params) (remove-old-registrants) (response (apply str (mapcat (fn [each-user-map] (let [inner-details (second each-user-map)] [["username" (get inner-details "username" "nothing found for user")] ["updated" (get inner-details "updated" "nothing found for updated")]])) @registry) --8<---cut here---end--->8--- Bye, Tassilo -- 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
how do I evaluate this lazy sequence?
I would like 2 types of advice: 1.) an answer to this specific question 2.) advice on how one is suppose to debug mysteries likes this I have a simple web app that serves some data (hopefully in JSON format, but at the moment I will accept anything at all). The app uses Ring and Moustache and outputs the data. We start with a simple atom: (def registry (atom {})) We put some data in this atom. And then we output it. But I have had great difficulty getting anything to appear on the screen. Assuming the problem was with the fact the main sequence was lazy, I added in doall everywhere it made sense. But I still can not get anything to work: (defn current-users [request] "The default action of this app. Add new users to the registry, and delete the ones that are more than 15 seconds old" (let [this-users-params (:params request) final-map-for-output {}] (add-to-logged-in-registry this-users-params) (remove-old-registrants) (response (apply str (into {} (doall (map (fn [each-user-map] (doall (let [inner-details (second each- user-map)] (assoc final-map-for-output "username" (get inner-details "username" "nothing found for user")) (assoc final-map-for-output "updated" (get inner-details "updated" "nothing found for updated")) final-map-for-output))) @registry))) The various variations I have tried on this have either given me a blank white page or: {} Nothing else. I used to do simply: (response (apply str (doall @registry) This worked fine. But it did not output valid JSON, so I wanted to change the format. But I have not been able to get anything to appear on screen. Suggestions? -- 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