On Wed Mar  9 11:16 2011, Andreas Kostler wrote:
> Hi all,
> 
> I need a macro to basically outputs this:
> 
> (macroexpand '(chain-field-queries record "location" "name" "country"))
> (. (. (. record (field "location")) (field "name")) (field "country"))
> 
> Which chains method calls on a java object. e.g. 
> record.field("location").field("name").field("country"). etc...
> so far so good. I though I could modify the .. macro for this:
> 
> (defmacro chain-field-queries
>           ([x form]  `(. ~x (field ~form)))
>         ([x form & more] `(chain (. ~x (field ~form)) ~@more)))
> 
> However, this results in 
> (macroexpand '(chain-field-queries record "location" "name" "country"))
> (. (. (. record (user/field "location")) (user/field "name")) (user/field 
> "country"))

You could quote the field as a symbol:

(defmacro chain-field-queries
  ([x form] `(. ~x (~'field ~form)))
  ([x form & more] `(chain-field-queries (. ~x (~'field ~form)) ~@more)))

> Now, I have a macro which produces the output above (without the
> namespace qualifier) but it looks odd. Is there an easier/more
> idiomatic way?

Is a macro really required?  You can do this as a function:

(defn chain-field-queries
  [record & fields]
  (let [query (fn [r f] (. r (field f)))]
    (reduce query record fields)))

Sincerely,

Daniel Solano Gómez

Attachment: pgp2oQes4bS62.pgp
Description: PGP signature

Reply via email to