On 17 November 2015 at 15:42, Nathaniel Smith <n...@pobox.com> wrote:
>> So for clarity:
>> True and -> right hand side evaluated stand alone
>> False and -> False
>> True or -> True
>> False or -> right hand side evaluated stand alone
>>
>> We can roll that up using the parse tree:
>> (('posix', '==', 'dud'), [('and', ('posix', '==', 'odd')), ('or',
>> ('posix', '==', 'fred'))]))
>> evaluate the start to get a 'result'
>> pop an expression from the beginning of the list giving opcode, next.
>> lookup (result, opcode) in the above truth table, giving one of True,
>> False, None
>> on None, result = next and loop.
>> on True or False, return that.
>
> Not sure if we're communicating or not? The case I'm concerned about is
>
> a or b and c
>
> which Python parses as (a or (b and c)) because 'and' has higher
> precedence than 'or'. So for example in Python,
>
> True or True and False
>
> returns True, but if you use a left-to-right evaluation rule than it
> returns False.


True or True and False
->
lookup = {
    (True, 'and'): None,
    (False, 'and'): False,
    (True, 'or'): True,
    (False, 'or'): None}

def evaluate(expr):
    result = expr[0]
    remainder = expr[1]
    while remainder:
        opcode, next = remainder.pop(0)
        branch = lookup[(result, opcode)]
        if branch is not None:
            return branch
        result = next
    return result

expr = (True, [('or', True), ('and', False)])
evaluate(expr)

-> True

So, I think what I describe does what you want it to.

-Rob

-- 
Robert Collins <rbtcoll...@hp.com>
Distinguished Technologist
HP Converged Cloud
_______________________________________________
Distutils-SIG maillist  -  Distutils-SIG@python.org
https://mail.python.org/mailman/listinfo/distutils-sig

Reply via email to