<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Aug 10, 2015 at 12:58 PM, Kirby Urner <span dir="ltr"><<a href="mailto:kurner@oreillyschool.com" target="_blank">kurner@oreillyschool.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote"><span class="">On Mon, Aug 10, 2015 at 12:02 PM, Mark Engelberg <span dir="ltr"><<a href="mailto:mark.engelberg@gmail.com" target="_blank">mark.engelberg@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><div class="gmail_quote"><span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><br>The idea of an interface has migrated to that of a "protocol" which provides a ready namespace for a "record".<br></div></div></div></div></blockquote><div><br></div></span><div>A protocol is more than just an "interface by a different name" or an "interface+namespace".<br></div></div></div></div></blockquote><div><br></div></span><div>For those not familiar with Java, it's single inheritance, so we don't have the happy solution of injecting new functionality by adding more base classes.<br><br></div><div>In Java, a class is said to "extend" a base class whereas an interface, a set of promised methods, is something a class "implements".<br><br></div><div>Whereas on my extend only one class at a time, said class may implement many interfaces.  <br><br></div><div>I see Clojure taps that ability too:<br><br><a href="http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/extend" target="_blank">http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/extend</a><br><br> <br></div><span class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><br></div><div>To understand the significance of a protocol, you need to first understand the "expression problem".  The expression problem asks you to consider a set of polymorphic functions over multiple datatypes.  Without controlling or being able to recompile the original source code, can you easily extend these functions to a new datatype, and can you easily create a new polymorphic function across those datatypes?<br></div></div></div></div></blockquote><div><br></div></span><div>I like to relate these concepts back to basic math and the different number types we start with, as concentric subsets:  N < Z < Q < R < C.<br><br></div><div>Then a protocol or interface is "the operations" such as - / + * < > and so on.  What common control panel of operations works across these sets?<br><br></div><div>Clojure, like Java, is not supportive of operator overloading right?  I can't go like:<br><br>(defprotocol VectorOps<br>  (__add__ [this other])<br>  (__sub__ [this other])<br>  (len [this])<br>  (__neg__ [this])<br>  (norm [this]))<br><br></div><div>... and then use (+ A B) to add two vectors, or (- A) to negate one.<br><br></div><div>I think the basics of Polymorphism may be communicated without introducing the wrinkle of not having original source code.  Not wanting to change it might be easier for a math student to understand.  <br><br>Not having the original source code sounds like a social problem, an institutional issue, vs. a truly theoretical issue, and that's confusing to newbies.<br><br></div><div>The + and - operators make sense in a Group, where - is both negation and for adding a negative inverse.  <br><br>Add * and / to the mix and we've got a field.  <br><br>Lots of datatypes participate in group and field relationships, including numbers module N, which we may imagine as a specific type of number.<br><br></div></div></div></div></blockquote><div><br></div><div>Sorry for typos.<br><br></div><div>... numbers *modulo* N -- given "module" is a Python word, this could be confusing.<br><br></div><div>Here's some source I code I wrote for that type of Number awhile back:<br><br><a href="http://www.4dsolutions.net/ocn/python/groups.py">http://www.4dsolutions.net/ocn/python/groups.py</a><br><br></div><div>Kirby<br><br><br><br></div></div><br></div></div>