I'm trying to write a helper macro for invoking a class's main.
Here's the macro:

(defmacro main [class & args]
  #^{:doc "Invoke class's main with specified arguments, which are
automatically stringified"}
  (if (= (count args) 0)
    `(. ~class main (make-array String 0))
    `(. ~class main (into-array (map str '~args)))))

Here is the intent.  You pass a class symbol and an optional list of
arguments.  The function stringifies the arguments and passes them to
the class's main.  If the argument list is empty, it passes an zero-
length java.lang.String array to the main.

Ok, simple enough.  Here's something to test it with:

package tango;

import java.util.Arrays;

public class Echo {
    public static void main(String args[]) {
        System.out.println("args=" + Arrays.asList(args));
    }
}

Here's what happens:

user=> (main tango.Echo "a")
args=[a]
nil
user=> (main tango.Echo "a" "b" "c")
args=[a, b, c]
nil
user=> (let [c "value of c"] (main tango.Echo "a" "b" c))
args=[a, b, c]
nil
user=>

I expected the last output to be 'args=[a,b,value of c]'.

To take the extra Java class out of the loop, I wrote this second
macro:

user=> (defmacro s [& args] `(java.util.Arrays/asList (into-array (map
str '~args))))
#'user/s
user=> (s "1")
#<ArrayList [1]>
user=> (s "1" "blah")
#<ArrayList [1, blah]>
user=> (let [c "value of c"] (s "1" c))
#<ArrayList [1, c]>
user=>

I'm using revision 1235 with Java 1.6.0_10.  Any suggestions?

Thanks,
Bill Smith
--~--~---------~--~----~------------~-------~--~----~
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
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to