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