"Jim - FooBar();" <[email protected]> writes:
> why can't I use the interface as function argument instead of the
> concrete class (record)?
>
> example: (defprotocol IPiece
> blah blah blah)
>
> (defrecord ChessPiece
> IPiece
> blah blah blah)
>
> (defrecord CheckersPiece
> IPiece
> blah blah blah)
>
> (defn move [^IPiece p] ;will complain that it can't resolve type IPiece
> blah blah blah)
The interface will reside in the current namespace, so you need to
qualify it.
--8<---------------cut here---------------start------------->8---
user> (defprotocol IPiece
(frobnicate [this]))
IPiece
user> IPiece
{:on-interface user.IPiece, :on user.IPiece, :sigs {:frobnicate {:doc nil,
:arglists ([this]), :name frobnicate}}, :var #'user/IPiece, :method-map
{:frobnicate :frobnicate}, :method-builders {#'user/frobnicate
#<user$eval2292$fn__2293 user$eval2292$fn__2293@62e6615f>}}
user> user.IPiece
user.IPiece
user> (class user.IPiece)
java.lang.Class
user> (.isInterface user.IPiece)
true
--8<---------------cut here---------------end--------------->8---
However, that there is an interface is more or less an implementation
detail. Protocol methods are dispatched dynamically and quickly enough,
so there's no benefit in type-hinting with generated interfaces. Too
prove that:
--8<---------------cut here---------------start------------->8---
user> (defrecord Frob [x]
IPiece
(frobnicate [this] x))
user.Frob
user> (defn frob1 [p] (frobnicate p))
#'user/frob1
user> (defn frob2 [^user.IPiece p] (frobnicate p))
#'user/frob2
user> (use 'criterium.core)
nil
user> (let [f (->Frob 10)]
(bench (frob1 f) :verbose)
(bench (frob2 f) :verbose))
amd64 Linux 3.4.0-gentoo 2 cpu(s)
OpenJDK 64-Bit Server VM 22.0-b10
Runtime arguments: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n
-XX:+TieredCompilation -Xmx1G
-Dclojure.compile.path=/home/horn/Repos/clj/testi/target/classes
-Dtesti.version=0.1.0-SNAPSHOT -Dclojure.debug=false
Evaluation count : 8495040
Execution time mean : 6.474061 us 95.0% CI: (6.473442 us,
6.474699 us)
Execution time std-deviation : 71.405519 ns 95.0% CI: (70.680926 ns,
72.202375 ns)
Execution time lower ci : 6.390741 us 95.0% CI: (6.390741 us,
6.390741 us)
Execution time upper ci : 6.595243 us 95.0% CI: (6.594962 us,
6.595243 us)
Found 1 outliers in 60 samples (1.6667 %)
low-severe 1 (1.6667 %)
Variance from outliers : 1.6389 % Variance is slightly inflated by outliers
amd64 Linux 3.4.0-gentoo 2 cpu(s)
OpenJDK 64-Bit Server VM 22.0-b10
Runtime arguments: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n
-XX:+TieredCompilation -Xmx1G
-Dclojure.compile.path=/home/horn/Repos/clj/testi/target/classes
-Dtesti.version=0.1.0-SNAPSHOT -Dclojure.debug=false
Evaluation count : 9339360
Execution time mean : 6.482568 us 95.0% CI: (6.481979 us,
6.483191 us)
Execution time std-deviation : 82.858647 ns 95.0% CI: (82.277583 ns,
83.438706 ns)
Execution time lower ci : 6.409230 us 95.0% CI: (6.409230 us,
6.409230 us)
Execution time upper ci : 6.648313 us 95.0% CI: (6.646894 us,
6.648313 us)
Found 3 outliers in 60 samples (5.0000 %)
low-severe 3 (5.0000 %)
Variance from outliers : 1.6389 % Variance is slightly inflated by outliers
nil
--8<---------------cut here---------------end--------------->8---
Here you can see that calls to the hinted `frob2` are not faster than
calls to the non-hinted `frob1`. So don't do that.
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