seems similar to this concept with "new":

=>* (new java.lang.RuntimeException "msg")* ;works this way
#<RuntimeException java.lang.RuntimeException: msg>

=> *(def a java.lang.RuntimeException)*
#'runtime.q/a
=> *a*
java.lang.RuntimeException
=> *(new a "msg")* ;nope
CompilerException java.lang.IllegalArgumentException: Unable to resolve
classname: a, compiling:(NO_SOURCE_PATH:1:1)
=> *(new (eval a) "msg")* ; nope
CompilerException java.lang.IllegalArgumentException: Unable to resolve
classname: (eval a), compiling:(NO_SOURCE_PATH:1:2)

=> *(defmacro new-instance [cls & args]*
*     `(new ~(eval cls) ~@args))*
#'runtime.q/new-instance
=> *(new-instance a "msg")* ; works
#<RuntimeException java.lang.RuntimeException: msg>

=> *(new-instance 'java.lang.RuntimeException "msg")* ;also works
#<RuntimeException java.lang.RuntimeException: msg>


or with "."
=> *(defmacro call-method [inst m & args]
     `(. ~inst ~(symbol (eval m)) ~@args))*
#'runtime.q/call-method
=> *(def someInst "somestringinstance")*
#'runtime.q/someInst
=> *(call-method someInst 'toUpperCase)*
"SOMESTRINGINSTANCE"
=> *(call-method someInst "toUpperCase")*
"SOMESTRINGINSTANCE"
=> *(call-method someInst toUpperCase)*
CompilerException java.lang.RuntimeException: Unable to resolve symbol:
toUpperCase in this context, compiling:(NO_SOURCE_PATH:1:1)
=> *(def four (* 2 2))*
#'runtime.q/four
=> *(call-method someInst 'substring (+ 1 1) four)*
"me"
=> *(call-method someInst "substring" (+ 1 1) four)*
"me"
=> *(call-method "abcde" (quote substring) 2 four)*
"cd"



On Tue, Feb 12, 2013 at 1:53 AM, juan.facorro <juan.faco...@gmail.com>wrote:

> Since a macro's arguments must be available at compile time, creating one
> for calling a runtime defined method won't work.
>
> Because of this we are left with *eval*, which actually compiles and then
> evaluates at runtime the expression it receives as an argument.
>
> Here's a function that receives an object, a method name (as a symbol or
> string) and optional arguments; and then uses eval to find the result:
>
>
> (ns calling-methods
>   (:require [clojure.reflect :as r]))
> ;-----------------------------
> (defn call-method* [obj m & args]
>   (eval `(. ~obj ~(symbol m) ~@args)))
> ;-----------------------------
> (def method-def (->> (r/reflect "String")
>                     :members
>                     (filter #(= "toString" (str (:name %))))
>                     first))
>
> (let [x     {:a 1 :b 2}
>       s     "hi"
>       upper "toUpperCase"]
>   (println (call-method* x (:name method-def)))
>   (println (call-method* "hi" (:name method-def)))
>   (println (call-method* "hi" upper)))
>
>
> Hope it helps.
>
> J
>
>
> On Monday, February 11, 2013 5:34:00 PM UTC-3, Bauna wrote:
>>
>> Hey all,
>> I'm a newbie that is trying to use clojure for my university grade
>> thesis.
>> In  our project we have to generate a graph structure invoking some
>> methods on a standard java class. This class is provided at run time, so
>> the methods that need to be called must be obtained by
>> reflection. I've been trying to use clojure.reflect, but I was not able
>> to find a way to invoke a method on the class with the symbols retrieved
>> from reflect (I know that I can use java interop and
>> use standard java reflection api).
>>
>> Here is and example of what I want to do:
>> user=> (require '[clojure.reflect :as r])
>> user=> (def method-def (filter #(= "toString" (str (:name %)))  (:members
>> (r/reflect "aClass"))))
>>
>> How do I invoke "toString" using "method-definition"?
>>
>> Thanks and regards,
>> --
>> Pablo Nussembaum
>>
>>
>>
>>  what is better to use java interop using java reflection API or use
>> clojure.reflect to option
>>
>  --
> --
> 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.
>
>
>



-- 
Please correct me if I'm wrong or incomplete,
even if you think I'll subconsciously hate it.

-- 
-- 
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.


Reply via email to