On Mon, Nov 16, 2015 at 7:27 PM, Robert Collins <robe...@robertcollins.net> wrote: > 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.
In [7]: evaluate((False, [('and', False), ('or', True)])) Out[7]: False In [8]: False and False or True Out[8]: True -n -- Nathaniel J. Smith -- http://vorpus.org _______________________________________________ Distutils-SIG maillist - Distutils-SIG@python.org https://mail.python.org/mailman/listinfo/distutils-sig