On Fri, Jul 29, 2011 at 3:18 PM, Andreas Liljeqvist <bon...@gmail.com>wrote:
> Is this a bug? > > Nope, expectation dissonance. > (defprotocol Notcloseable (dosomething [this])) > > This is what actually defines the function "dosomething". Once this definition happens, the function exists and can be called. If you try to call it before there are any implementations though you'll get: user=> (dosomething 1) java.lang.IllegalArgumentException: No implementation of method: :dosomething of protocol: #'user/Notcloseable found for class: java.lang.Integer (NO_SOURCE_FILE:0) It _also_ for interop purposes defines a Java interface, which classes that implement the protocol may or may not implement. If you use extend-type, they will not. If you use deftype or defrecord to create a new class that implements the protocol, it will also implement the interface. This is the basis for the performance advantage of protocols. > (defrecord Archive [] > java.io.Closeable > (close [_] (print "closeable")) > > Notcloseable > (dosomething [_] (print "something"))) > > > user> (def a (Archive.)) > > user> (.close a) > closeable > Uses interop to call through the Closeable interface. > user> (close a) > > Unable to resolve symbol: close in this context > [Thrown class java.lang.Exception] > No such function exists. > user> (dosomething a) > something > Uses the protocol function, and calls the implementation you've provided. > user> (.dosomething a) > something > > Uses the interop support to call the Protocol's interface method. > Implementing a protol creates both java function and a clojure function. > Implementing an interface only creates the java function. > I'm not sure why you expect that implementing an interface would create a function? --Aaron -- 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