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
pgp2oQes4bS62.pgp
Description: PGP signature
