Evaluation of complex conditions

Pete pete at mollysrevenge.com
Thu Oct 6 12:40:45 EDT 2011


Thanks Alex, makes total sense with the examples you provided.

The only remaining question in my mind is if the use of parens changes
anything - a post yesterday suggested that putting a condition in parens
causes it to be evaluated ahead of the other conditions but I can't make
that happen in your example.  I suspect confusion between precedence and
evaluation again.

Pete
Molly's Revenge <http://www.mollysrevenge.com>




On Thu, Oct 6, 2011 at 3:55 AM, Alex Tweedly <alex at tweedly.net> wrote:

> Don't confuse "operator precedence" and "order of evaluation".
>
> precedence tells you how the results of individual parts of the calculation
> are combined. For instance,  1+2*3+4 will give 11 (i.e. multiplication is
> higher precedence than addition, so the 2 is multiplied by the 3 and then
> that is used in the lower precedence addition). If you wanted different, you
> would need brackets  ...   (1+2)*(3+4) would give you 21 (3*7).
>
> order of evaluation (for LC) is  left to right (regardless of precedence
> !!).
>
> Try this cute test case
>
>> global C
>>
>> function getnext
>>   add 1 to C
>>   return C
>> end getnext
>>
>> on mouseUp
>>   put 0 into C
>>   put getnext()+getnext()*getnext()+**getnext()
>> end mouseUp
>>
> this results in 11 - i.e. 1 + 2*3 + 4
>
> If evaluation order had followed precedence then it would have been 3 +
> (1*2) + 4 ---> 9
>
> The similar rules apply when evaluating logical expressions in a test
> condition, with the additional proviso that LC will stop evaluating the
> terms of the expression as soon as the eventual result is determined. So,
>
>> on mouseUp
>>   put 0 into C
>>   if getnext() > 0 and getnext() < 2 and getnext()< 3 and getnext()<3 then
>>      put "that's a surprise"
>>   else
>>      put getnext()
>>   end if
>> end mouseUp
>>
> produces 3  (first term is true, second term is false and at that point we
> know the whole expression must be false, so we stop evaluating - therefore
> the next call to getnext() produces 3
>
> -- Alex.
>
> On 06/10/2011 01:26, Pete wrote:
>
>> I just read the section in the manual about operator precedence and I
>> think
>> perhaps I'm even more confused than I was!  It details a strict order of
>> precedence which seems to contradict the knowledge that condition
>> evaluation
>> proceeds from left to right and stops as soon as a false one is found.
>>
>> Maybe I'll try a few test cases.
>>
>>
>> Pete
>> Molly's Revenge<http://www.**mollysrevenge.com<http://www.mollysrevenge.com>
>> >
>>
>>
>
> ______________________________**_________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your
> subscription preferences:
> http://lists.runrev.com/**mailman/listinfo/use-livecode<http://lists.runrev.com/mailman/listinfo/use-livecode>
>
>



More information about the Use-livecode mailing list