Hi, Am 27.01.2011 um 23:08 schrieb OGINO Masanori:
> It seems ugly for someone using them like function frequently, but > cool for someone using them like function rarely. Consider this: (defn to-factory [record] (-> record name (.replaceAll "([a-z0-9])([A-Z])" "$1-$2") .toLowerCase (->> (str "make-")) symbol)) (defmacro defrecordx [name fields & more] (let [defaults (into {} (map #(if (vector? %) % [% nil]) fields)) fields (vec (map #(if (vector? %) (nth % 0) %) fields))] `(do (defrecord ~name ~fields clojure.lang.IFn (invoke [this# key#] (get this# key#)) (invoke [this# key# default#] (get this# key# default#)) ~@more) (defn ~(to-factory name) [& {:keys ~fields :or ~defaults}] (new ~name ~@fields))))) Usage example: (defrecordx Ant [direction [food false]]) (make-ant :direction 0) vs. (defstruct ant :direction :food) (struct-map ant :direction 0 :food false) I kind of miss the difference in ugliness. If you want default values for your structs you also need a factory function. So unless you write the factory function for each struct, you'll also need a defstructx. records will be the way to go. Even today. And I'm yet to see a reasonable example, where structs have any advantage over records. records might not be perfect at the moment, but neither are structs… 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