On Monday, December 30, 2013 6:27:05 PM UTC+1, Cedric Greevey wrote: > > On Mon, Dec 30, 2013 at 12:13 PM, Massimiliano Tomassoli < > kiuh...@gmail.com <javascript:>> wrote: > >> On Sunday, December 29, 2013 10:11:47 PM UTC+1, tbc++ wrote: >>> >>> Not mentioned in Cedric's post are two other important things: >>> >>> Protocols can be extended to existing types. For example: >>> >>> (defprotocol IType >>> (type-as-string [x])) >>> >>> (extend-protocol IType >>> String >>> (type-as-string [x] "string") >>> Integer >>> (type-as-string [x] "integer")) >>> >>> => (type-as-string 42) >>> "integer" >>> >>> Here we are adding new methods to "sealed" closed classes that already >>> exist in the JVM. We never modify these classes, we simply extend our >>> protocol to them. >>> >>> Secondly, all protocol functions are namespaced. This allows us to >>> extend classes without fear of overwriting existing methods. This then is >>> more powerful than monkey patching in Ruby or Python as the resulting >>> method is more like 42.user_type-as-string(). Clojure's namespace system >>> then allows you to refer to one method or the other just as you would any >>> normal functions. >>> >> >> You're not really adding methods to classes in Clojure. You're just >> defining external functions. Can you make them private or protected? In my >> opinion, the Expression Problem in FP and OOP are two different problems. >> In FP you can "solve" it more easily because you use pseudo-classes which >> don't behave like real classes at all. The proof of this is that any >> sufficiently dynamic OO language can solve the problem the same way Clojure >> does just by using classes with no methods and by using overloading >> resolved at runtime. >> Of course, you don't do that in OOP because you want to work with real >> classes. For instance, C# has extension methods which let you "add" methods >> to existing classes without any recompilation. Problem solved? I don't >> think so. Extension methods are just static functions that emulate the >> behavior of instance methods, but without any kind of encapsulation and >> possibility of inheritance. >> > > Encapsulation is less important without a lot of mutable state lying > around, and remains important mainly at module boundaries, not "class"-like > boundaries, where code belonging to different programmers comes into > contact. If I change the internals of doohickey A and that breaks doohickey > B inside the same module, I can fix B, and I know how to, and I know to do > so as soon as I change A. It's when someone else changes doohickey C in a > different module that I'm in trouble if I'm depending on the internals, but > then hopefully there's an encapsulation boundary at the module boundary > between my stuff and doohickey C. > > As for inheritance, it's *highly* overrated, complecting as it does > composition and polymorphism. We Clojurians tend to keep those separated, > and as a result protocols are purely about polymorphism while composition > is dealt with in some orthogonal way. >
That's your opinion and I respect that. Maybe someday I'll come around to seeing things your way as I delve into Clojure, but I doubt it :) But I still think that we can't compare OOP and non-OOP languages w.r.t. the Expression Problem. If the Expression Problem consists in extending classes then non-OOP languages must be excluded because they don't have classes. We can't put datatypes and classes on the same level. They're just different 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 --- 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.