I'm also quite new to Clojure, but here are some very superficial changes I would make to your code, without actually giving much thought to your algorithms:
(defn- transform-album-images [images] (into {} (for [image images] [(:size image) (:#text image)]))) (defn- transform-album [album] (-> (select-keys album [:name :artist :image]) (update-in [:image] transform-album-images) (clojure.set/rename-keys { :image :images }))) (defn search [term] (let [albums (-> (api/get {:method "album.search" :album term}) (get-in [:results :albummatches :album] []) (vector))] {:albums (map transform-album albums)})) -Steven On Tue, Apr 23, 2013 at 4:12 PM, Huey Petersen <eys...@gmail.com> wrote: > 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. > > > -- -- 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.