Hi, maybe Ken's solution needs some clarification
1. Use a map, not a struct. defstruct is kinda deprecated. 2. Use a keyword (preceded by a colon) to code the nationality. A keyword is created only once and won't consume any more memory if you use it repeatedly. I'm not sure whether you want to save the memory or the repeated typing. 3. Ken bundled all persons in the map by language. This may be the right solution for you or not. But if you do so, note that the inner maps reside in a vector (square brackets) Maybe something like this: ;; a function returning a map representing a person (defn make-person [nationality first last] {:first first :last last :nationality nationality}) ;; the data on which you base the creation of persons ;; This repeats the keyword for each person (def persons-data [[:english "Jim" "Silvester"] [:english "Stephen" "Howards"] [:chinese "Chiu" "Chiu"]]) ;; combine the fn and the data (def persons (into [] (map #(apply make-person %) persons-data))) ;; A second way of storing your data uses (almost) the representation suggested by Ken: (def persons-data-2 {:english [["Jim" "Silvester"] ["Stephen" "Howards"]] :chinese ["Chiu" "Chiu"]}) ;; This can be turned into a seq of persons like this (def persons-2 (map (fn [natio names] ; can't use #() because it doesn't nest (map (fn [[first last]] ; note the destructuring (make-person natio first last)) names)) persons-data-2)) Hope this helps, Stefan -- 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