well :title and :visible are not the only ones i want to support, i
would like something that would work with any keyword and convert it
to the right setter.

you are right about the need for a let. i've been away from lisp for a
while, and i forgot about this sort of thing. but will a let fix my
evaluation problem?

On Oct 27, 6:00 pm, mb <[EMAIL PROTECTED]> wrote:
> Hi,
>
> On 27 Okt., 21:08, Matt Moriarity <[EMAIL PROTECTED]> wrote:
>
>
>
> > I am trying to write a macro to rewrite something like this:
>
> >   (set-props my-jframe :title "blah" :visible true)
>
> > Into calls to the setter methods. I finally settled on this:
>
> >   (defmacro set-props [obj & props]
> >     (let [prop-map (apply hash-map props)]
> >       `(do
> >          ~(for [[key val] prop-map]
> >             `(~(keyword-to-method key) ~obj ~val))
> >          ~obj)))
>
> > where keyword-to-method just converts :title into .setTitle.
> > ...
> > how can i make this work?
>
> You probably don't need a macro here.
>
>   (use '[clojure.contrib.fcase :only (case)])
>
>   (defn keyword-to-method
>     [kw]
>     (case kw
>       :title   #(. %1 setTitle %2)
>       :visible #(. %1 setVisible %2)))
>
>   (defn set-props
>     [obj & props]
>     (do
>       (doseq [k v] (partition 2 props)
>         ((keyword-to-method k) obj v))
>       obj))
>
> This is a pretty naive implementation, but it should probably
> work.
>
> Just a note about your macro. You should not insert the same
> value several times. It will be evaluated several times. Imagine
> you call your macro as (set-props (new JFrame) ...). The object
> actually returned is a different JFrame!
>
> The correct way is to use a let.
>
>   (defmacro xxx
>     [obj]
>     `(let [obj# ~obj]
>        (do-stuff-with obj#)
>        (and-more-stuff obj#)))
>
> Now the obj is just evaluated once. symbol# is a short way to
> generate a unique symbol, which can be used to cache the value.
>
> Hope this helps.
>
> Sincerely
> Meikel
--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to