On Sep 22, 2:30 pm, Chouser <chou...@gmail.com> wrote: > On Mon, Sep 21, 2009 at 5:22 PM, sross <ros...@gmail.com> wrote: > > > Hi All, > > > I'm looking for a bit of advice for calling a java method which has a > > few different signatures (such as Connection.prepareStatement). > > Is there a cleaner way of passing a variable number of arguments to > > the method, such as > > > (apply (memfn prepareStatement) (sql/connection) args) > > > or is doing something like the following the only approach. > > > (defn prepare-statement > > ([sql] (.prepareStatement (sql/connection) sql)) > > ([sql arg] (.prepareStatement (sql/connection) sql arg)) > > ([sql arg arg2] (.prepareStatement (sql/connection) sql arg arg2)) > > ([sql arg arg2 arg3] (.prepareStatement (sql/connection) sql arg > > arg2 arg3))) > > Your solution will provide the best performance (you may need > to type-hint the args). If performance doesn't matter, you > can use Rich's jcall fn: > > (defn jcall [obj name & args] > (clojure.lang.Reflector.invokeInstanceMethod > obj > (str name) > (if args (to-array args) (clojure.lang.RT.EMPTY_ARRAY)))) > > Then you could: > > (defn prepare-statement [& args] > (apply jcall (sql/connection) "prepareStatement" args)) > > Note that uses runtime reflection, array creation, etc. each > time it's called. You can expect it to be at least an order > of magnitude slower than if it were directly compiled like > your original solution could be. > > --Chouser
Thanks for a solution and the advice. --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---