Difficult problem.
macro are syntactic tools. So they are not made to evaluate things at runtime.
You could expand to something that call eval at runtime but it is not
a good idea (It involves the compiler at each call)
If your (rest alist) is known at macro-expansion time, then it can
work but to help, I would need to know the context in which you are
using it.
What you want to do would be done by apply for functions.
However, as far as I know, apply do not work on method calls.
If you look at the problem from the java point of view, it is quite hard to
write some code that call a method with an unkown number of argument
without using reflection.
If you have a fix number of argument, you can do this:
(defmacro call-5
"Calls an instance method on a given object with a list of params."
[obj method-name params]
`(apply (fn [x1# x2# x3# x4# x5#] (. ~obj ~(symbol method-name) x1#
x2# x3# x4# x5#) ) ~params))
You can also write a macro that takes the arity as a parameter and do
that trick.
You can also generate an anonymous function with multiple arity
`(apply
(fn ([x1#] (. ~obj ~(symbol method-name) x1# ))
([x1# x2#] (. ~obj ~(symbol method-name) x1# x2#))
([x1# x2# x3#] (. ~obj ~(symbol method-name) x1# x2# x3#))
... up to enough (20 should do the trick) .... ~params)
However, ti might be easier to explain what you are trying to achieve
in a bigger context to see if there is a simpler path.
Best,
Nicolas.
On Mon, Sep 27, 2010 at 6:52 AM, stefanmuenchow <[email protected]> wrote:
> I am a macro newbie... I want to create a macro that calls a function
> with a given name and a parameter list on a given object. My first
> idea was like this:
>
> (defmacro call
> "Calls an instance method on a given object with a list of params."
> [obj method-name params]
> `(. ~obj ~(symbol method-name) ~...@params))
>
> It works fine, if the param list is a simple list, like "(1 2 3 4)",
> but if params is created from an existing list, like "(rest alist)"
> then it doesn't work. So params has to be evaluated first and then the
> single params has to be expanded. How do I do that? I tried it with a
> let block then I got other errors.
>
> --
> 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
--
Sent from an IBM Model M, 15 August 1989.
--
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