Howdy, I'm a clojure fan but quite new to writing clojure. I'm writing my first app and had a few style questions.
I'm doing a web service call to the lastfm api. It returns some json like: { "results": { "albummatches": { "album": [ { "name": "In The Future", "artist": "Black Mountain", "image": [{ "size": "small", "#text": "http://example.com/image/url.jpg" }] } ] } } } One notes is that the 'album' key in the json can either be missing (0 results) a map itself (1 result) or the array (2+ results). I then want to turn it into structure like: { "albums": [{ "name": "In The Future", "artist": "Black Mountain", "images": { "small": "http://example.com/image/url.jpg" } }] } Here is the clojure code I came up with: (defn- transform-album-images [images] (into {} (map (fn [image] [(:size image) (:#text image)]) images))) (defn- transform-album [album] (let [album (select-keys album [:name :artist :image]) album (update-in album [:image] transform-album-images) album (clojure.set/rename-keys album { :image :images })] album)) (defn search [term] (let [albums (api/get {:method "album.search" :album term}) albums (get-in albums [:results :albummatches :album] []) albums (if (vector? albums) albums (vector albums)) albums (map transform-album albums)] {:albums albums})) My main question is whether this is at all 'idomatic' clojure. I have a few specific questions too. - I broke out two functions -- transform-album-images and transform-album -- because I wasn't sure how to squeeze them into the first function. They really have no purpose outside of the 'search' function though. I don't know why, but it kinda bugs me because it seems to detract from the main function 'search' as they have to appear above 'search'. - the (api/get ...) call talks to an external webservice. Everything else is a 'pure' function. Is including the (api/get) call inside the 'search' function bad? I'm a bit hazy on the write split from pure / non-pure code. I feel like transforming data between two representations with a side effect at each end is like 90% of code I write so I'd like to get a good feel for doing this in clojure :) Thanks for any tips. -- -- 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 unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.