Hi Nicolas, sorry, that last post missed the second part, I meant to add;

If you know the method you wish to call, do you not know the class and can
thus call the static method directly?

-Adrian.

On Tue, Jul 7, 2009 at 5:21 AM, Adrian Cuthbertson <
adrian.cuthbert...@gmail.com> wrote:

> You can call the static method directly on the class name;
>
> (java.nio.ByteBuffer/allocate 1024)
>
> or just (ByteBuffer/allocat 1024)
> if it's imported.
>
> Rgds, Adrian.
>
>
> On Tue, Jul 7, 2009 at 2:16 AM, Nicolas Buduroi <nbudu...@gmail.com>wrote:
>
>>
>> I've just figured out that the macro version in the allocate example
>> can't be  used with local variables.
>>
>> (let [foo ByteBuffer]
>>  (allocate1 foo 1024))
>>
>> throws java.lang.UnsupportedOperationException: Can't eval locals
>> (NO_SOURCE_FILE:94)
>>
>> On Jul 6, 6:59 pm, Nicolas Buduroi <nbudu...@gmail.com> wrote:
>> > Hi, I needed to call a static method on a class stored in a var
>> > yesterday and found that it was a little bit trickier than I initially
>> > thought. There's three way of doing it, the two first are quite
>> > straightforward and working ;-) e.g.:
>> >
>> > (import '(java.nio ByteBuffer FloatBuffer))
>> >
>> > (def foo ByteBuffer)
>> >
>> > (. foo (allocate 1024)) ; throw an exception as intended.
>> >
>> > (defmacro allocate1 [buffer-type size]
>> >   `(. ~(eval buffer-type) (allocate ~size)))
>> >
>> > (defn allocate2 [buffer-type size]
>> >   (eval `(. ~buffer-type (allocate ~size))))
>> >
>> > (allocate1 foo 1024)
>> > (allocate2 foo 1024)
>> >
>> > Both works fine, but I'm still not sure which one is the best. The
>> > third way is to call a static method from the class object, I've tried
>> > something but wasn't able to get it working. It throws some weird
>> > exception, here's the code:
>> >
>> > (defn to-primitive [class]
>> >  (try
>> >  (let [type (.getField (identity class) "TYPE")]
>> >    (.get type Object))
>> >  (catch NoSuchFieldException _ class)))
>> >
>> > (defmacro call-static [class name & args]
>> >  (let [arg-types (into-array
>> >                  (map (comp to-primitive #(.getClass %)) args))
>> >       method (.getMethod (eval class) name arg-types)]
>> >   `(.invoke ~method ~class ~...@args)))
>> >
>> > When calling this macro (call-static foo "allocate" 1024) it throws:
>> > java.lang.RuntimeException: Can't embed object in code, maybe print-
>> > dup not defined: public static java.nio.ByteBuffer
>> > java.nio.ByteBuffer.allocate(int) (NO_SOURCE_FILE:0)
>> >
>> > This error message is quite puzzling isn't it?
>> >
>> > Is there any other way?
>> >
>> > Thanks
>> >
>> > - budu
>> >>
>>
>

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

Reply via email to