Hi, Am 10.08.2010 um 20:56 schrieb Alan:
> which is exactly what I want. But I have failed countless times to > define a make-hand function - I'd like to be able to call (make- > hand :west {:spade [9 5], :club [10]}) and get back > > {:spade > ({:suit :spade, :owner :west, :rank 9} > {:suit :spade, :owner :west, :rank 5}), > :club > ({:suit :club, :owner :west, :rank 10})} > > Can someone put me on the right track? I'm sure the solution for this > is trivially simple but I can't quite find it. So from your description the function signature should look like this: (defn make-hand [owner suit-map] ...) Now we have to fill the dots. Let's have a look at the map. It already has the right structure: it maps suits to things. In the input it's the vector of ranks, in the output it should be the sequence of card maps. We have to do it for all contained suits. And then pack everything back into a map. (defn make-hand [owner suit-map] (->> suit-map (map (fn [[suit ranks]] [suit (map (partial struct-map card :suit suit :owner owner :rank) ranks)])) (into (empty suit-map)))) Another possibility is to gradually transform the input map, which is not a problem due to Clojure's persistent data structures. (defn make-hand [owner suit-map] (reduce (fn [suit-map suit] (update-in suit-map [suit] (fn [ranks] (map (partial struct-map card :suit suit :owner owner :rank) ranks)))) suit-map (keys suit-map))) Hope that helps. Sincerely Meikel -- 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