On Mon, Jun 15, 2009 at 9:13 AM, Parth<parth.malwan...@gmail.com> wrote: > > > > On Jun 15, 7:08 am, James Koppel <darmanith...@gmail.com> wrote: >> I am trying to write a function to simplify working with GridBagConstraints >> -- that is, instead of writing >> >> (let [c (GridBagConstraints.)] >> (set! (.weightx c) 2.0) >> (set! (.gridwidth c) GridBagConstraints/REMAINDER) >> (let [button (JButton. "Hello, world!")] >> (.setConstraints (.getLayout *my-container*) button c) >> (.add *my-container* button))) >> >> I could simply write >> >> (gridbag-add *my-container* >> (JButton. "Hello, world!") >> "weightx=2.0;gridwith=GridBagConstraints/REMAINDER") >> >> A simple combination of regexes and read-string would easily allow me to >> extract the symbol 'GridBagConstraints/REMAINDER from the example string, >> but I'm having trouble actually converting it into its value. Using resolve >> simply returns nil, and getting "." to work dynamically seems to be >> fruitless, as even this simple call >> >> (. (resolve 'GridBagConstraints) REMAINDER) >> >> throws an exception. >> >> So, the question is, how do I go dynamically from a string like >> "GridBagConstraints/REMAINDER" to the actual value of the static field? >> >> Of course, eval does the trick, but I'd rather not have to resort to it. > > One way to do that would be to use a map: > > user=> (def m {"Math/PI" Math/PI "Math/E" Math/E}) > #'user/m > user=> (defn foo [n s] [n (get m s :not-found)]) > #'user/foo > user=> (foo 10 "Math/PI") > [10 3.141592653589793] > user=> > > You could also consider writing a function that takes these > as parameters and returns the updated container. That way > you can avoid the regex. > > Regards, > Parth >
Not sure if this can be fit in with what you're trying to do, but you can accomplish this with a macro: user=> (defmacro resolve-sym-str [s] (let [[ns sym] (.split s "/")] (symbol ns sym))) #'user/resolve-sym-str user=> (resolve-sym-str "Math/PI") 3.141592653589793 user=> However, looking at this further, it seems that the first part of what you have tried works: user=> (import '(java.awt GridBagConstraints)) nil user=> (resolve 'GridBagConstraints) java.awt.GridBagConstraints Now you can use Java's reflection API to grab the field you want: user=> (-> (resolve 'GridBagConstraints) (.getDeclaredField "REMAINDER") (.get nil)) 0 So it would appear this is possible without a macro, which probably makes it easier to use. /mike --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---