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(); <[email protected]>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(); <[email protected]>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 [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 >> --- 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 [email protected]. >> 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 [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 > --- > 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 [email protected]. > 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 [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 > --- > 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 [email protected]. > 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 [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 --- 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 [email protected]. For more options, visit https://groups.google.com/groups/opt_out.
