Garth Sheldon-Coulson <garth.sheldoncoul...@gmail.com> writes: Hi Garth,
> I'm returning to Clojure in earnest for the first time since 1.1 (and > very happy to be back!). Apologies if this question revisits old > issues. I've revisited mostly the same 2 days ago: <87399ocg9a....@thinkpad.tsdh.de> > I'm trying to understand why the semantics of protocols are such that > the third statement here returns true: > > user=> (defprotocol Bashable (bash [this]) (boom [this])) > Bashable > > user=> (defrecord Record [] Bashable (bash [this] "bash!")) > user.Record > > user=> (and (satisfies? Bashable (Record.)) (extends? Bashable > Record)) > true > > This returns true even though boom is not implemented for Record: > > user=> (boom (Record.)) > AbstractMethodError user.Record.boom()Ljava/lang/Object; user/eval55 > (NO_SOURCE_FILE:3) > > Apparently, types/records can implement a protocol "in name only." What do you mean with "in name only"? > What is behind this choice? Intuitively, I would have conceived of a > protocol as a collection of methods all of which must be implemented > in order for a type/record to extend the protocol. I think it would be nice if extends?/satisfies? would return the set of implemented methods, say, as keywords. Then you could check if an object implements exactly the methods that your function wants to call. > A second question. How does one "explicitly" extend a protocol per the > documentation of the extenders function? Intuitively, I would have > thought that the code above "explicitly" extends Bashable if it > extends Bashable at all. Yet: > > user=> (extenders Bashable) > nil That was my initial question in my posting two days ago. extenders returns only types that extend a protocol using the `extend' function (or `extend-type', `extend-protocol' macros). So this works: user> (defprotocol Bashable (bash [this]) (boom [this])) Bashable user> (defrecord Record []) user.Record user> (extend-protocol Bashable Record (bash [_] "Bash!")) nil user> (extenders Bashable) (user.Record) IMO, that behavior is not very obvious. OTOH, Stu said that extenders is specific to the extend form (as suggested by its name), and in fact, neither defrecord's nor deftype's documentation speak of extending a protocol, but their terminology is to supply method implementations for protocol methods. But then, what's the use case of `extenders' anyway? I mean, I want to know what types participate in a protocol. I don't care if they do because they were explicitly extended to the protocol or because the method implementations were provided directly in their definition form. That's an implementation detail I shouldn't have to bother with... Bye, Tassilo -- 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