why does defrecord and deftype exist? shouldn't deftype be sufficient? Why is defrecord encouraged over deftype, with defype reserved for low level bits?
it is because records can act like a generic map, which means data is not hidden inside the type, which makes types created with defrecord much more useful. How much more useful then is an ordinary map(Where you can actually remove all the keys)? I was the first person to introduce protocols and records into our code base work, and I have colleagues who are even more ragingly anti-protocols/types. Which I think is a little crazy, they are useful and service a purpose. But even I am outraged by how quickly multimethods (things of beauty, joy, and power) were abandoned by the community once a shiny new toy (types/protocols) was available that if you squinted at looked sort of like the object stuff. On Sun, May 20, 2012 at 2:26 PM, Kevin Downey <redc...@gmail.com> wrote: > On Sun, May 20, 2012 at 2:23 PM, Warren Lynn <wrn.l...@gmail.com> wrote: >> Well, I don't want to be a beginner for too long, :-) > > then "As a Clojure programmer you should only need them rarely." > >> On May 20, 5:19 pm, Kevin Downey <redc...@gmail.com> wrote: >>> On Sun, May 20, 2012 at 2:13 PM, Warren Lynn <wrn.l...@gmail.com> wrote: >>> > Maybe for Person/Employee example with very simple functions do not >>> > need data types, but I don't think that is generally true (isn't >>> > "defrecord" trying to patching that up?). When I say "need" I am not >>> > saying you cannot achieve what you want to do without it (just as >>> > assembly code can do anything), but things will get so flexible (hence >>> > the lack of pattern) the language will be "powerful" only on paper >>> > very soon. I am glad Clojure does not seem to be heading that >>> > direction, but still I think there might be things we can improve on. >>> >>> defrecord, deftype, and defprotocol provide extensible low level >>> abstractions like the kind Clojure is built on. >>> >>> As a Clojure programmer you should only need them rarely. >>> >>> As a beginner you should never use them. >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> > On May 20, 4:51 pm, Kevin Downey <redc...@gmail.com> wrote: >>> >> On Sun, May 20, 2012 at 10:22 AM, Warren Lynn <wrn.l...@gmail.com> wrote: >>> >> > So from what I read the philosophy of Clojure discourages inheritance >>> >> > on concrete data types. However, maybe I am too entrenched in my OO >>> >> > thinking, how do I define a new record type that includes all the data >>> >> > members of another record type? I am thinking about the classic >>> >> > Employee/Person example. >>> >>> >> Don't make data members. Use maps and multimethods. You don't need >>> >> types for this. You have data about a thing, keep it has data, >>> >> suddenly all the functions that work on data structures (select-keys, >>> >> update-in, clojure.set) all work on your data instead of having your >>> >> data locked away in a type. >>> >>> >> > If I can define a record of Employee with Person's data members >>> >> > included, even that is not true inheritance (as no protocols of >>> >> > "Person" will be automatically extended to "Employee"), I need that >>> >> > for function re-use (so a function working on Person will >>> >> > automatically work on Employee because Employee is guaranteed to have >>> >> > all the data members in Person). >>> >>> >> > Also, again, maybe I am too OO minded, is there a way inherit another >>> >> > record type's protocol implementation? That seems to give the best >>> >> > combination of both worlds (OO and functional), so you can either have >>> >> > you own very customized combination of data type/protocols, or use the >>> >> > very common OO pattern. Just like we have both the single-typed >>> >> > dispatching (which is more OO like and covers a large portion of use >>> >> > cases), and more advanced multimethods. >>> >>> >> > Thanks. >>> >>> >> > -- >>> >> > 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 >>> >>> >> -- >>> >> And what is good, Phaedrus, >>> >> And what is not good— >>> >> Need we ask anyone to tell us these things? >>> >>> > -- >>> > 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 >>> >>> -- >>> And what is good, Phaedrus, >>> And what is not good— >>> Need we ask anyone to tell us these things? >> >> -- >> 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 > > > > -- > And what is good, Phaedrus, > And what is not good— > Need we ask anyone to tell us these things? -- And what is good, Phaedrus, And what is not good— Need we ask anyone to tell us these things? -- 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