[stringtemplate-interest] "Or" and "And" operators in conditionnal always evaluate both operands ?

Sam Harwell sharwell at pixelminegames.com
Thu Sep 15 09:33:41 PDT 2011


The point is this is entirely an implementation detail. There's no benefit
to documenting the semantics in a short circuit manner because that behavior
is only semantically relevant in a language where expression evaluation can
have side effects and/or null references can occur, neither of which applies
to StringTemplate.

Sam

-----Original Message-----
From: stringtemplate-interest-bounces at antlr.org
[mailto:stringtemplate-interest-bounces at antlr.org] On Behalf Of Udo
Borkowski
Sent: Thursday, September 15, 2011 10:02 AM
To: Sam Barnett-Cormack
Cc: stringtemplate-interest List; Damien Urruty
Subject: Re: [stringtemplate-interest] "Or" and "And" operators in
conditionnal always evaluate both operands ?

> The usual pattern in most languages I've experiences is to 'short 
> circuit' conditionals in this way - for &&, don't bother with the 
> second if the first is false, for ||, don't bother if it's true. This 
> has great behavioural effects widely used in languages like perl, but 
> those don't really apply to ST that I can see.

Because ST has no side effects I would argue it is very reasonable to assume
&& and || are implemented in the "short circuit" way. Why should ST execute
code that does not have any effect? 

If there is no strong argument against an "short circuit" implementation I
suggest to change it to the "lazy" style. 

This will have no effect on the output but just run (a little bit) faster in
some cases. So it should be a safe and compatible change.

Udo


On 15.09.2011, at 16:01, Sam Barnett-Cormack wrote:

> The usual pattern in most languages I've experiences is to 'short 
> circuit' conditionals in this way - for &&, don't bother with the 
> second if the first is false, for ||, don't bother if it's true. This 
> has great behavioural effects widely used in languages like perl, but 
> those don't really apply to ST that I can see.
> 
> However, the specific case you identify is a good one. If you're in a 
> situation where it's not a 'bad usage' of your template to have 'a'
> unset, you definitely want to be able to test members of a for truth 
> or existence at the very least, without syntactic merry-go-rounds or 
> risking very strange errors.
> 
> Then again, maybe short-circuit isn't the way to deal with this case. 
> Maybe there's some better way of handling cases that would seem to 
> lead to such functionality being disireable. Who knows?
> 
> Sam (not the usual Sam)
> 
> On 15/09/2011 14:54, Damien Urruty wrote:
>> Hi,
>> 
>> The problem I am facing is that my conditional is something like :
>> 
>> <if(a && a.b)>
>> 
>> Which raises an error in the case a is null (a.b is still evaluated).
>> 
>> By the way, the error is not very explicit : "templateName : no such 
>> property or can't access: null attribute". I spent some time finding 
>> where the error came from.
>> 
>> It is not a question of performance, I was just wondering if this 
>> behaviour was normal, I mean if this is by design, or if it was a bug.
>> 
>> In my case, I can easily break the if in two separate ifs, so it 
>> doesn't really matter. But as in Java the && does not evaluate all 
>> the operands if not necessary (the & operator do evaluate each 
>> operand), i wanted to know if this behaviour was wanted or not.
>> 
>> Maybe this should be discussed, I know it is not very important, or 
>> at least it should be mentionned somewhere in the doc ?
>> 
>> Thanks for your response Sam, have a nice day
>> 
>> ---------------------------------------------------------------------
>> ---
>> From: sharwell at pixelminegames.com
>> To: lepilache at hotmail.com; stringtemplate-interest at antlr.org
>> Subject: RE: [stringtemplate-interest] "Or" and "And" operators in 
>> conditionnal always evaluate both operands ?
>> Date: Thu, 15 Sep 2011 08:43:29 -0500
>> 
>> Hi Damien,
>> 
>> Since the attributes referenced from a StringTemplate should always 
>> be pure (no side effects), then there is no semantic difference 
>> between evaluating or not evaluating the second argument. Are you 
>> facing a significant performance problem due to the second evaluation?
>> 
>> Sam
>> 
>> *From:*stringtemplate-interest-bounces at antlr.org
>> [mailto:stringtemplate-interest-bounces at antlr.org] *On Behalf Of 
>> *Damien Urruty
>> *Sent:* Thursday, September 15, 2011 8:01 AM
>> *To:* stringtemplate-interest at antlr.org
>> *Subject:* [stringtemplate-interest] "Or" and "And" operators in 
>> conditionnal always evaluate both operands ?
>> 
>> Hello,
>> 
>> I can see that if we use && and || operands in conditionnals, both 
>> operands are always evaluated, even if not necessary. For exemple, I have
:
>> 
>> <if(a && b)>
>> 
>> ...
>> 
>> <endif>
>> 
>> In my case, a is null, so it is not necessary to evaluate the second 
>> argument, right ? Shouldn't the evaluation stop when such a case is 
>> encountered ? It is the same for <if(a || b)> with a not null.
>> 
>> Maybe I miss something, thanks for your help.
>> 
>> 
>> 
>> _______________________________________________
>> 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

_______________________________________________
stringtemplate-interest mailing list
stringtemplate-interest at antlr.org
http://www.antlr.org/mailman/listinfo/stringtemplate-interest



More information about the stringtemplate-interest mailing list