Thank you! I didn't know you could do .newInstance
oh that's a nice trick with eval and list 'new
So it's not impossible after all, thanks Aaron!
Here's what I got from what you said:
=> *(defmacro mew [cls & restt]
`(eval (list 'new ~cls ~@restt))
)*
#'runtime.q/mew
=> *(let [a java.lang.RuntimeException]
(mew a)
)*
#<RuntimeException java.lang.RuntimeException>
it makes sense now, using eval at runtime not at compile time as I was
trying
and also the newInstance variant:
=> *(defmacro mew [cls & restt]
`(.newInstance ~cls ~@restt)
)*
#'runtime.q/mew
=> *(let [a java.lang.RuntimeException]
(mew a)
)*
#<RuntimeException java.lang.RuntimeException>
Really, thank you Aaron,
On Thu, Feb 14, 2013 at 11:02 PM, Aaron Cohen <[email protected]> wrote:
> Yes, since this is runtime you should use reflection.
>
> (let [a java.lang.RuntimeException]
> (.newInstance a))
>
> Alternatively, you can use eval:
>
> (let [a java.lang.RuntimeException]
> (eval (list 'new a)))
>
>
> On Thu, Feb 14, 2013 at 4:53 PM, AtKaaZ <[email protected]> wrote:
>
>> I figure since new is expecting a class at compiletime, we can never pass
>> it a class that we evaluate at runtime(those locals), ergo => impossible to
>> macro around "new" like that
>>
>> like this => impossible:
>> *(let [a java.lang.RuntimeException]
>> (macro-that-eventually-calls-new a))*
>>
>> maybe someone could suggest another way? clojure.reflect ?
>>
>>
>>
>> On Thu, Feb 14, 2013 at 10:40 PM, AtKaaZ <[email protected]> wrote:
>>
>>> thanks for the reply,
>>>
>>> => *(defmacro mew [cls & args]
>>> `(new ~cls ~@args))*
>>> #'runtime.q/mew
>>> =>* (let [a java.lang.RuntimeException]
>>> (mew a)
>>> )*
>>>
>>> CompilerException java.lang.IllegalArgumentException: Unable to resolve
>>> classname: a, compiling:(NO_SOURCE_PATH:2:3)
>>>
>>> that would be the equivalent macro of what *new* is doing
>>> it's like
>>> *(new a)*
>>> CompilerException java.lang.IllegalArgumentException: Unable to resolve
>>> classname: a, compiling:(NO_SOURCE_PATH:2:3)
>>>
>>>
>>> This is the goal:
>>>
>>> The goal is to can write this form:
>>> => *(let [a java.lang.RuntimeException]
>>> (new a))*
>>>
>>> but I think it's impossible, at least by using "new" it is
>>>
>>>
>>> On Thu, Feb 14, 2013 at 10:34 PM, Andy Fingerhut <
>>> [email protected]> wrote:
>>>
>>>>
>>>> On Feb 14, 2013, at 1:27 PM, AtKaaZ wrote:
>>>>
>>>> The goal is to can write this form:
>>>> => *(let [a java.lang.RuntimeException]
>>>> (new a)
>>>> )*
>>>> CompilerException java.lang.IllegalArgumentException: Unable to resolve
>>>> classname: a, compiling:(NO_SOURCE_PATH:2:3)
>>>>
>>>> attempt with macro:
>>>> =>* (defmacro mew [cls & restt]
>>>> `(new ~(eval cls) ~@restt)
>>>> )*
>>>> #'runtime.q/mew
>>>>
>>>>
>>>> This is probably your closest attempt. Try this variation on the above:
>>>>
>>>> (defmacro mew [cls & args]
>>>> `(new ~cls ~@args))
>>>>
>>>> user=> (macroexpand-1 '(mew java.lang.RuntimeException))
>>>> (new java.lang.RuntimeException)
>>>>
>>>> Andy
>>>>
>>>> --
>>>> --
>>>> 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.
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>> --
>>> Please correct me if I'm wrong or incomplete,
>>> even if you think I'll subconsciously hate it.
>>>
>>>
>>
>>
>> --
>> 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 [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.
>
>
>
--
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 [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.