# [metapost] short-circuit logic

Laurent Méhats laurent.mehats at gmail.com
Thu Jun 23 12:33:26 CEST 2011

Le 23/06/2011 00:33, Troy Henderson a écrit :
> Does MetaPost have a short-circuit logical "or" and "and"?
>
> That is, if a and b are booleans, and if a is false, then "a and b"
> should evaluate to false independent of the value of b (and should not
> even consider b).
>
> Similarly, if a is true, then "a or b" should evaluate to true
> independent of the value of b (and should not even consider b).
>
> Troy
> --
> http://tug.org/metapost/

Hello,

Here are attempts that go the way you describe.

vardef lazyand (text CONDS)=
boolean res;
res:=false;
for cond=CONDS:
res:=scantokens cond;
exitif not res;
endfor
res
enddef;

vardef lazyor (text CONDS)=
boolean res;
res:=true;
for cond=CONDS:
res:=scantokens cond;
exitif res;
endfor
res
enddef;

Both 'lazyand' and 'lazyor' expect arbitrary long (possibly empty)
parenthesized lists of conditions in double quotes. As an example,
assuming 'var' is unknown, 'lazyor ("unknown var", "var=0")' returns
'true' while '(unknown var) or (var=0)' fails since metapost tries to
evaluate 'var=0': '! Unknown relation will be considered false.'

Regards,
Laurent Méhats