Skip to content

Commit 8a77dca

Browse files
committed
Add and or not
Add `iif(v, t, f)` Add `==` `!=` `<` `<=` `>` `>=`
1 parent 4244e2c commit 8a77dca

File tree

1 file changed

+36
-7
lines changed

1 file changed

+36
-7
lines changed

py/math_expression.py

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
ast.BitAnd: op.and_,
1717
ast.BitOr: op.or_,
1818
ast.Invert: op.invert,
19-
ast.And: op.and_,
19+
ast.And: lambda a, b: 1 if a and b else 0,
20+
ast.Or: lambda a, b: 1 if a or b else 0,
21+
ast.Not: lambda a: 0 if a else 1,
2022
}
2123

2224
# TODO: restructure args to provide more info, generate hint based on args to save duplication
@@ -66,6 +68,11 @@
6668
"call": lambda a = None: int(a),
6769
"hint": "number"
6870
},
71+
"iif": {
72+
"args": (3, 3),
73+
"call": lambda a, b, c = None: b if a else c,
74+
"hint": "value, truepart, falsepart"
75+
},
6976
}
7077

7178
autocompleteWords = list({
@@ -150,15 +157,20 @@ def evaluate(self, expression, prompt, extra_pnginfo={}, a=None, b=None, c=None)
150157

151158
lookup = {"a": a, "b": b, "c": c}
152159

160+
def eval_op(l, r):
161+
l = eval_expr(l)
162+
r = eval_expr(r)
163+
l = l if isinstance(l, int) else float(l)
164+
r = r if isinstance(r, int) else float(r)
165+
return operators[type(node.op)](l, r)
166+
153167
def eval_expr(node):
154-
if isinstance(node, ast.Num):
168+
if isinstance(node, ast.Constant) or isinstance(node, ast.Num):
155169
return node.n
156170
elif isinstance(node, ast.BinOp):
157-
l = eval_expr(node.left)
158-
r = eval_expr(node.right)
159-
l = l if isinstance(l, int) else float(l)
160-
r = r if isinstance(r, int) else float(r)
161-
return operators[type(node.op)](l, r)
171+
return eval_op(node.left, node.right)
172+
elif isinstance(node, ast.BoolOp):
173+
return eval_op(node.values[0], node.values[1])
162174
elif isinstance(node, ast.UnaryOp):
163175
return operators[type(node.op)](eval_expr(node.operand))
164176
elif isinstance(node, ast.Attribute):
@@ -192,6 +204,23 @@ def eval_expr(node):
192204
args.append(eval_expr(arg))
193205
return fn["call"](*args)
194206
raise NameError(f"Invalid function call: {node.func.id}")
207+
elif isinstance(node, ast.Compare):
208+
l = eval_expr(node.left)
209+
r = eval_expr(node.comparators[0])
210+
if isinstance(node.ops[0], ast.Eq):
211+
return 1 if l == r else 0
212+
if isinstance(node.ops[0], ast.NotEq):
213+
return 1 if l != r else 0
214+
if isinstance(node.ops[0], ast.Gt):
215+
return 1 if l > r else 0
216+
if isinstance(node.ops[0], ast.GtE):
217+
return 1 if l >= r else 0
218+
if isinstance(node.ops[0], ast.Lt):
219+
return 1 if l < r else 0
220+
if isinstance(node.ops[0], ast.LtE):
221+
return 1 if l <= r else 0
222+
raise NotImplementedError(
223+
"Operator " + node.ops[0].__class__.__name__ + " not supported.")
195224
else:
196225
raise TypeError(node)
197226

0 commit comments

Comments
 (0)