[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