That helped, thanks Christophe.

I have one more problem:

I put it in a util file, under a util namespace:

(ns lambinator.util)

(defmacro sets! [vars & rest]
  `(do ~@(map (fn [flds] `(set! (. ~vars ~(first flds)) ~(second
flds))) (apply array-map rest))))


Now I want to use it outside that namespace.  It seems that I have to
do two things when I load from a jar...

(require 'lambinator.util)

(lambinator.util/sets! c fill GridBagConstraints/VERTICAL weightx 1.5)

How do I use the function/macro outside the namespace it was created
in without prefixing it with lambinator.util?  Import, require don't
seem to do what I want...

Chris

On Dec 20, 12:28 am, Christophe Grand <christo...@cgrand.net> wrote:
> chris a écrit :
>
> > Hello, I am gearing up to write some swing code, specifically some
> > stuff where I want to use the grid bag layout system, and I remember
> > something I hated about java:
>
> > --c.fill = GridBagConstraints.HORIZONTAL;
> > c.weightx = 0.5;
> > c.gridx = 2;
> > c.gridy = 0;
> > --
>
> > You repeated c all over the place so you didn't dare name it something
> > reasonable.
>
> > I noticed in some closure code this looks about the same (actually
> > worse):
> > (set! (.fill c) GridBagConstraints/HORIZONTAL)
> >     (set! (.anchor c) GridBagConstraints/PAGE_END)
> >     (set! (.weightx c) 1.0)
> >     (set! (.weighty c) 1.0)
>
> Your sets! macro seems a good idea to me.
>
> When an object provides proper accessors, you can write:
>
> (doto c
>   (.setFill GridBagConstraints/HORIZONTAL)
>   (.setAnchor GridBagConstraints/PAGE_END)
>   (.setWeightx 1.0)
>   (.setWeighty 1.0))
>
> But in your case, the only way to use doto I can think of is:
>
> (doto c
>   (-> .fill (set! GridBagConstraints/HORIZONTAL))
>   (-> .anchor (set! GridBagConstraints/PAGE_END))
>   (-> .weightx (set! 1.0))
>   (-> .weighty (set! 1.0)))
>
> which does not repeat c but is even slightly longer than the naive
> sequence of set!.
>
> I think that you could remove some parens from your macro form to just
> write:
>
> (sets! c
>   fill GridBagConstraints/HORIZONTAL
>   weightx 1.0)
>
> (I think it's a more idiomatic form, see cond or bindings: pairs aren't
> paired together.)
>
> (defmacro sets! [vars & rest]
>   `(do ~@(map (fn [flds] `(set! (. ~vars ~(first flds)) ~(second flds)))
> (apply array-map rest))))
>
> Christophe
--~--~---------~--~----~------------~-------~--~----~
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 
clojure+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to