Warren Lynn <[email protected]> writes:
Hi Warren,
> I found that if I define a protocol like this:
>
> (defprotocol IProc
> (procMethod [this] "some method"))
>
> I can invoke it on a type either
> (procMethod object)
> or
> (.procMethod object)
>
> Note the prefix dot in the second case.
>
> I like this "dot" version because that means I can replace a record field
> with a method with the same name and things will work as usual, like
> "property" in Python. However, I think someone mentioned that the dot
> version is just a JVM implementation detail that got exposed so it seems I
> cannot rely on it as part of the language. Is that the case?
Yes. Defining a protocol on the JVM also creates an interface with the
same name in the current package, and records and types satisfying that
protocol implement this interface. So this works:
--8<---------------cut here---------------start------------->8---
(defprotocol Fooable
(foo [this]))
(defrecord FooRec []
Fooable
(foo [this] this))
(foo (->FooRec))
#user.FooRec{}
user> (.foo (->FooRec))
Reflection warning, NO_SOURCE_FILE:1 - reference to field foo can't be resolved.
#user.FooRec{}
--8<---------------cut here---------------end--------------->8---
Note that you get a reflection warning in the dot-case which you can
avoid by type-hinting with the implicitly generated interface.
--8<---------------cut here---------------start------------->8---
user> (.foo ^user.Fooable (->FooRec))
#user.FooRec{}
--8<---------------cut here---------------end--------------->8---
However, the dot-syntax won't work if you extend your protocol
dynamically to existing types.
--8<---------------cut here---------------start------------->8---
(extend-protocol Fooable
java.util.Date
(foo [this] this))
user> (foo (java.util.Date.))
#inst "2012-07-23T06:07:51.130-00:00"
user> (.foo (java.util.Date.))
Reflection warning, NO_SOURCE_FILE:1 - reference to field foo can't be resolved.
No matching field found: foo for class java.util.Date
[Thrown class java.lang.IllegalArgumentException]
--8<---------------cut here---------------end--------------->8---
Bye,
Tassilo
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en