I'm curious for the response re: #3 as well, but one pain point I've experienced with protocols vs multimethods is that as a system evolves, retaining the semantics that led me to bundle functions together into a protocol in the first place has sometimes been difficult, a source of incidental complexity. It winds up being easier and more coherent to distribute multimethods between namespaces- even though initially going all multimethods at the start feels less clean.
On Sun, Jan 19, 2014 at 7:37 PM, Sam Ritchie <sritchi...@gmail.com> wrote: > can you elaborate on #3? What constraints did you run into with type-based > dispatch that a multimethod that dispatched on :op allowed you to get > around? It seems like, if that's your pattern, lifting the :op field up > into an actual record type would only give you MORE freedom. You rely on > the convention of a type, and the typeclass-like protocol dispatch, rather > than re-inventing the identifier with an :op field. > > Just curious as to what problems that records have caused (especially > since you could write multimethods that dispatched on type and change that > later if you actually do need the flexibility). > > Timothy Baldridge <tbaldri...@gmail.com> > January 19, 2014 5:10 PM > A couple of things on this subject: > > 1) protocols were invented primarily for their speed. If one was going to > write Clojure in Clojure it would be a little hard to implement > PersistentHashMaps using pure data. You have to start with something. Thus > deftype and defprotocol were born. > > 2) Unlike in most OOP, the protocol methods are not tied to the object. > Instead they are tied to the function. You can see that with the function > clojure.core/extend. Extend says "when you call function A with a type T as > the first argument, dispatch to function B". This is quite a bit different > from normal polymorphism (especially in languages like Python/Ruby, etc). > > 3) Thirdly I'd say that using protocols/types for data is often considered > a bit un-idiomatic. For example, see the ClojureScript compiler: > https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/compiler.clj#L377 > > The AST of ClojureScript is stored in nested hashmaps, and dispatching is > done on the :op value in each map. No records, no protocols, no types. Just > hashmaps and multimethods. I would argue that this is the "Clojure way". > Use data, except when performance requirements dictate otherwise. Almost > everytime I've built a large codebase using protocols instead of > multimethods, I've regretted it. "Data all the things"...as the saying > goes. > > Timothy Baldridge > > > > > > -- > “One of the main causes of the fall of the Roman Empire was that–lacking > zero–they had no way to indicate successful termination of their C > programs.” > (Robert Firth) > -- > -- > 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. > James Reeves <ja...@booleanknot.com> > January 19, 2014 2:55 PM > On 19 January 2014 19:55, Brian Craft <craft.br...@gmail.com> wrote: > >> http://www.youtube.com/watch?v=ROor6_NGIWU >> >> Around 56:28 Rich is talking about whether components pass a data >> structure, or "an object that has all these verbs and knows how to do stuff >> ...". >> >> Clojure data types also have verbs, in protocols, and if one component >> passes a record to another component, the receiver will need to use those >> verbs to make use of the data. How is that different than the OOP example? >> There's the syntactic difference that in OOP you write it object, verb, >> arguments, and in clojure you write it verb, object, arguments. But that's >> trivial. How is it architecturally different to pass an object with methods >> vs passing a record with protocol? >> > > Protocols should be considered a tool for polymorphism, rather than a tool > for encapsulation. You shouldn't consider protocols to be tightly coupled > to a record or type. > > To give a more concrete example, consider a edn data structure like: > > #inst "2014-01-19T21:44:46.471-00:00" > > By default Clojure reads this as a java.util.Date object, but we could > equally read this as a org.joda.time.DateTime object, or > a hirondelle.date4j.DateTime object. > > All these implementations describe the same data, but will have subtly > different methods and interfaces. The data structure serialised in edn > doesn't mandate a particular class, or a particular set of methods. > > Similarly, if we imagine a data structure like: > > #myapp/Person {:first "Fred" :last "Mertz"} > > You should think of this as a map tagged with "#myapp/Person", not a > representation of a specific Clojure record that has a specific set of > functions. It's up to the receiver to interpret this data, and the > functions that operate on this data might differ between components. For > instance, a component that displays the data to the user might have a > function to derive a person's full name, but a component that archives the > data wouldn't need this functionality. > > - James > -- > -- > 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. > Brian Craft <craft.br...@gmail.com> > January 19, 2014 12:55 PM > http://www.youtube.com/watch?v=ROor6_NGIWU > > Around 56:28 Rich is talking about whether components pass a data > structure, or "an object that has all these verbs and knows how to do stuff > ...". > > Clojure data types also have verbs, in protocols, and if one component > passes a record to another component, the receiver will need to use those > verbs to make use of the data. How is that different than the OOP example? > There's the syntactic difference that in OOP you write it object, verb, > arguments, and in clojure you write it verb, object, arguments. But that's > trivial. How is it architecturally different to pass an object with methods > vs passing a record with protocol? > -- > -- > 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. > > > -- > Sam Ritchie (@sritchie) > Paddleguru Co-Founder > 703.863.8561 > www.paddleguru.com > Twitter <http://twitter.com/paddleguru> // > Facebook<http://facebook.com/paddleguru> > > -- > -- > 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.
<<postbox-contact.jpg>>
<<compose-unknown-contact.jpg>>