Hi,

BTW, if it can be an option for you, there's also the MigLayout layout
manager ( http://www.miglayout.com/ ) that allows to write constraints
as Strings. It has already been mentioned on this ml, so maybe there's
clojure stuff done for integrating it more closely with clojure ?

HTH,

-- 
Laurent

2009/6/18 James Koppel <darmanith...@gmail.com>:
> Thanks! Seems I forgot java.lang.reflect exists when I wrote that.
>
> On Wed, Jun 17, 2009 at 4:47 PM, Michael Reid <kid.me...@gmail.com> wrote:
>>
>> 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
-~----------~----~----~----~------~----~------~--~---

Reply via email to