OK now I'm confused! If you are using an unnamed fn form there is only
one place to put the return type-hin,t and that is between the 'fn' and
the '[...]'
...but, you've just demonstrated that this causes reflection...where
else can we put it?
Jim
On 17/06/13 18:33, Ambrose Bonnaire-Sergeant wrote:
Seems like there's some trickery involved with using Vars.
This example seems to use reflection.
user=> (.length ((fn ^String [^String s] (.substring s 0 (.length s)))
"a"))
Reflection warning, NO_SOURCE_PATH:1:1 - reference to field length
can't be resolved.
1
Thanks,
Ambrose
On Tue, Jun 18, 2013 at 1:15 AM, Ambrose Bonnaire-Sergeant
<abonnaireserge...@gmail.com <mailto:abonnaireserge...@gmail.com>> wrote:
Yes, it did. That's interesting. I have no idea where the .length
method is being inferred from in the last example.
Carry on :)
Ambrose
On Tue, Jun 18, 2013 at 1:10 AM, Jim - FooBar();
<jimpil1...@gmail.com <mailto:jimpil1...@gmail.com>> wrote:
so how about this then?
nREPL server started on port 43830
REPL-y 0.2.0
Clojure 1.5.1
Docs: (doc function-name-here)
(find-doc "part-of-name-here")
Source: (source function-name-here)
Javadoc: (javadoc java-object-or-class-here)
Exit: Control+D or (exit) or (quit)
user=> (set! *warn-on-reflection* true)
true
user=> (defn foo [^String s] (.substring s 0 (.length s)))
#'user/foo
user=> (foo "jim")
"jim"
user=> (.length (foo "jim"))
*Reflection warning, NO_SOURCE_PATH:1:1 - reference to field
length can't be resolved.*
3
user=> (defn foo ^String [^String s] (.substring s 0 (.length s)))
#'user/foo
user=> (.length (foo "jim"))
3
user=> (defn ^String foo [^String s] (.substring s 0 (.length
s)))
#'user/foo
user=> (.length (foo "jim"))
3
it worked both times didn't it?
Jim
On 17/06/13 17:59, Ambrose Bonnaire-Sergeant wrote:
After some investigation, the before-the-arglist syntax only
seems useful for defining fn's that return primitive types.
They don't seem to help resolve reflection calls.
(require '[clojure.tools.analyzer :refer [ast]])
; this creates a double-emitting fn
(ast (fn (^double [^double a] a)))
; =>
;{:op :fn-expr,
; ...
; :methods
; ({:op :fn-method,
; ...
; :arg-types (#<Type Ljava/lang/Object;>),
; :return-type #<Type D>}), ;double return type here
; ...
; :tag nil} ; no tag
; this creates a regular old fn
(ast (fn (^String [a] 1)))
; =>
;{:op :fn-expr,
; ...
; ({:op :fn-method,
; ...
; :arg-types (#<Type Ljava/lang/Object;>),
; :return-type #<Type Ljava/lang/Object;>}), ;object
return type
; ...
; :tag nil} ; no tag
; this creates a String-hinted fn
(ast ^String (fn a [a] 1))
;{:op :meta,
; ...
; :expr
; {:op :fn-expr,
; ...
; :methods
; ({:op :fn-method,
; :arg-types (#<Type Ljava/lang/Object;>),
; :return-type #<Type Ljava/lang/Object;>}),
; ...
; :tag String}}
I don't see where before-the-arglist is useful outside of
primitive fns.
Thanks,
Ambrose
On Mon, Jun 17, 2013 at 7:59 PM, Jim - FooBar();
<jimpil1...@gmail.com <mailto:jimpil1...@gmail.com>> wrote:
Hi all,
It seems to me that return type-hints can go either right
after "defn", or after the doc-string. I generally, put
the return type-hints right before the argument vector
and it seems to get rid of reflection. However, I just
had a look at core.contrib.strutils2 and the author(s)
put the type hint right after 'defn' (before the var
about to be defined) and again it gets rid of reflection!
Which one is it? both are acceptable?
thanks in advance,
Jim
--
--
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 <mailto: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
<mailto:clojure%2bunsubscr...@googlegroups.com>
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- You received this message because you are subscribed
to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails
from it, send an email to
clojure+unsubscr...@googlegroups.com
<mailto:clojure%2bunsubscr...@googlegroups.com>.
For more options, visit
https://groups.google.com/groups/opt_out.
--
--
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
<mailto: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
<mailto:clojure+unsubscr...@googlegroups.com>
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the
Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from
it, send an email to clojure+unsubscr...@googlegroups.com
<mailto:clojure+unsubscr...@googlegroups.com>.
For more options, visit https://groups.google.com/groups/opt_out.
--
--
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
<mailto: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
<mailto:clojure%2bunsubscr...@googlegroups.com>
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the
Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from
it, send an email to clojure+unsubscr...@googlegroups.com
<mailto:clojure%2bunsubscr...@googlegroups.com>.
For more options, visit https://groups.google.com/groups/opt_out.
--
--
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
---
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send
an email to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
--
--
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
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.