[stringtemplate-interest] [ST4] How to avoid map key iteration?
Udo Borkowski
ub at abego-software.de
Mon Feb 14 01:20:51 PST 2011
Hi Sam,
> If you write it this way:
> ...
> <t2(adr=p,line2={<adr.city>, <adr.zip>})>
Good point.
I guess it is just my personal style (and background) that makes me raise the issue. Inside a subtemplate I'd prefer to access the parameters of the subtemplate (the {p1,p2|…}) over the access of something outside of the subtemplate, especially with the dynamic name lookup of ST4 in mind.
Udo
On 13.02.2011, at 18:09, Sam Harwell wrote:
> If you write it this way:
>
> t2(adr,line2={<adr.zip> <adr.city>}) ::= <<
> <adr.firstname> <adr.lastname>
> <line2>
> >>
>
> Then you can do this:
>
> <t2(adr=p,line2={<adr.city>, <a.zip>})>
>
> Sam
>
> From: stringtemplate-interest-bounces at antlr.org [mailto:stringtemplate-interest-bounces at antlr.org] On Behalf Of Udo Borkowski
> Sent: Sunday, February 13, 2011 3:09 AM
> To: Terence Parr
> Cc: stringtemplate-interest List
> Subject: Re: [stringtemplate-interest] [ST4] How to avoid map key iteration?
>
> Hi Ter,
>
>
> Hi. my first thought is, don't try to iterate over the object.
> ...
> <adr:{t|<t.zip> <t.city>}>
> :-)
>
> OK, I was trying to make the example as simple as possible, just to show my case. Of cause this simple example could be written as you suggest.
>
> My point is: when writing:
>
> <adr:{t|<t.zip> <t.city>}>
>
> I don't want to "iterate" over the object but rather pass an argument to the anonymous templates. The "iterate" happens accidently, just because adr also is iterable.
>
>
> Here the more complete example:
>
> Assume we have this template:
>
> t1(adr) ::= <<
> <adr.firstname> <adr.lastname>
> <adr.zip> <adr.city>
> >>
>
> With my "bean style" model object I get a result like this:
>
> ---------
> Joe Smith
> 12345 Somecity
> ---------
>
> Most times the format "zip city" is OK. However sometimes it needs to be formatted differently.Therefore I make the second line a parameter with the common case as the default:
>
> t2(adr,line2={<adr:{a|<a.zip> <a.city>}>}) ::= <<
> <adr.firstname> <adr.lastname>
> <line2>
> >>
>
> This way I can still call the template like this most of the time:
>
> <t2(adr=p)>
>
> and when a different 2nd line format is needed, I pass it in:
>
> <t2(adr=p,line2={<adr:{a|<a.city>, <a.zip>}>})>
>
> In this example the result would be:
>
> ----------
> Joe Smith
> Somecity, 12345
> ----------
>
> This all works fine with the bean-style model object.
>
> However when I switch to a model object that extends a Map class things break and I get an error like:
>
> no such property or can't access: java.lang.String.zip
>
>
> I hope this somewhat lengthy example make things more clearer.
>
>
> I guess from a language design point of view I would provide different constructs for the "iterate" vs. "pass argument to anonymous template" case, e.g.
>
> <adr:{…}> // the "iterate" case, i.e. "anything iterable" is used as an iterator, as now
>
> <adr::{…}> // the "pass arg" case, i.e. don't handle iterables differently, just pass in to anon template
>
>
> Udo
>
>
> On 11.02.2011, at 17:39, Terence Parr wrote:
>
>
> Hi. my first thought is, don't try to iterate over the object.
>
> <adr.zip> <adr.city>
>
> is same as:
>
> <adr:{t|<t.zip> <t.city>}>
>
> Ter
> On Feb 11, 2011, at 5:45 AM, Udo Borkowski wrote:
>
>
> Hi,
>
> is there any way to prevent the "iteration" over map keys when using a template like <m:{t|…}> (m may be a map or a simple object)?
>
> Details:
>
> I am using a template like this:
>
> writeAddress(adr) ::= <<
> ...
> <adr:{t|<t.zip> <t.city>}>
> ...
> >>
>
> adr represents an "Address" with properties "street", "zip", "city" etc.
>
> Initially this was implemented by a bean-style model class Address. Everything worked as expected.
>
> Now I changed the model class to a more "dynamic" implementation by using a Map. I.e. "zip", "city", etc. are now keys in the map, mapping to their resp. values.
>
> Expressions like this:
>
> <a.zip>
>
> still work fine, but
>
> <adr:{t|<t.zip> <t.city>}>
>
> runs into an error:
>
> no such property or can't access: java.lang.String.zip
>
> This is because the new model instance "accidentally" is a Map and the expression now iterates over the keys of the map ("zip" being the first).
>
> How can this iteration be avoided?
>
>
> Udo
>
>
> _______________________________________________
> stringtemplate-interest mailing list
> stringtemplate-interest at antlr.org
> http://www.antlr.org/mailman/listinfo/stringtemplate-interest
>
> _______________________________________________
> stringtemplate-interest mailing list
> stringtemplate-interest at antlr.org
> http://www.antlr.org/mailman/listinfo/stringtemplate-interest
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.antlr.org/pipermail/stringtemplate-interest/attachments/20110214/5974b599/attachment-0001.html
More information about the stringtemplate-interest
mailing list