[stringtemplate-interest] dealing with empty list values

Jonathan Buhacoff jonathan at buhacoff.net
Wed Feb 10 07:06:55 PST 2010


Oops I got it backwards.

The default mode is like $strip(values):{ ... }$  and with null=false   
it's what Joshua expects when he writes $values:{ ... }$

Right?

On Feb 8, 2010, at 7:11 PM, Joshua Royalty wrote:

>
>
> On Mon, Feb 8, 2010 at 1:51 PM, Terence Parr <parrt at cs.usfca.edu>  
> wrote:
> On Feb 7, 2010, at 5:02 PM, Joshua Royalty wrote:
> Hi Terence,
> > If $foo$ is 'missing', then '<tr>$if(foo)<b>$foo$</b>$else$MISSING 
> $endif$</tr>' will still print '<tr>MISSING</tr>', but $values:{ v |  
> <tr>$if(v)<b>$v$</b>$else$MISSING$endif$</tr>}$ will not print  
> '<tr>MISSING</tr>' if one of the values is 'missing'.
>
> unless you use the null option, right?
>
> is null=false the intended way to do this?  If so it.. works, but it  
> doesn't seem like a clean solution.  First you end up with lists  
> with multiple types of values..  which is just generally not a good  
> idea.  Second.. it is nice that it preserves backwards  
> compatibility, and its relatively easy to implement.. but it really  
> seems like a solution tacked on at the last minute and its not  
> intuitive at all to a programmer.
>
>
> >  Obviously in the first case ST does not know what text it should  
> skip and the user obviously intended it to print <tr>MISSING</tr>,  
> and I contend that ST also cannot know if it should skip in the  
> second case and that the user obviously intended it to print  
> <tr>MISSING</tr> for values that were 'missing'.  When I use a list  
> iterator I intuitively expect it to iterate over every value in the  
> list, it should be the same as repeating the code inside the  
> template for every value in the list, even if that value is 'missing'.
>
> Well, if foo is missing then $foo:blort()$ should not evaluate  
> blort() and it doesn't. Therefore when foo his multi-valued, it  
> should skip any empty values to be consistent, right?
>
> Depends on how you think about it..  See below
>
>
> > Also, length(values) return the length of the list with the nulls  
> included, and in order to get the length without them you need to  
> call length(strip(values)).
>
> You're right.  that is inconsistent. on the other hand, given that  
> you might be using the null option, there has to be a way to figure  
> out how many total elements you're going to have.
>
> Again, the inconsistencies make it seem like this was tacked on  
> instead of integrated into the framework..  And that makes it harder  
> to remember and use.
>
>
> > To be consistent with the current ST list iterator length(values)  
> should automatically strip nulls...  However, another fix would be  
> to not automatically skip nulls in the list iterator.  This would  
> fix both of the inconsistencies and be much more intuitive.  If  
> people want to skip the nulls entirely when iterating they can use  
> strip as a shortcut, $strip(values):{ v | <tr><b>$v$</b></tr>}$.   
> For backwards compatibility / convienience you can add a global  
> 'AutoStripLists' option if you think its necessary.
>
> I understand what you're saying, but what about the case when foo a  
> single value that I have above? should it invoke blort()?
>
> I think I may have found the communications disconnect.  I've been  
> treating ':' as the 'list iterator' operator... you seem to be  
> treating it as the 'apply template'/'expand list and apply template'  
> operator..
>
> If you think of ':' as the 'list iterator' operator (which is how  
> the cheat sheet describes it..), then actually, no, blort should not  
> be invoked because by using the 'list iterator' operator (instead of  
> the 'invoke template' ($<template>(<attr>)$) operator) you are  
> implying that it is a multi-valued attribute.  (so $<attr>:<template> 
> $ is a shortcut for $if(<attr>)$$<template>(<attr>)$$endif$ when  
> <attr> is single valued... (though personally I would spell it out  
> the second way..))
>
>
>
> I guess the real question it comes down to is what is more  
> important..  convienience in the case that you want to not want to  
> apply the template to null items in a list or having a consistent  
> (and thereby intuitive) framework.  Needing to skip null elements in  
> a list seems like a pretty uncommon case to me.. (I could be wrong),  
> and its the only piece that would not be backwards compatible.  If  
> people really need to skip nulls, they could simply use 'strip'.. or  
> there could be a global 'UseStripIterator' setting..
> _______________________________________________
> 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/20100210/def03764/attachment.html 


More information about the stringtemplate-interest mailing list