aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2021-11-19 12:55:32 +0200
committerJan Tuomi <jans.tuomi@gmail.com>2021-11-19 12:55:32 +0200
commitfe12f80810b2c2e9fa57e9a9a8ad21b410aa9c68 (patch)
treef61014dc44ed4bea170c03d531c82e59a736bce5
parentbe425db3d907dce7004d10253028ec8677a8dd8d (diff)
WIP expression eval
-rw-r--r--src/main.rs25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/main.rs b/src/main.rs
index 9843aa7..0685cb0 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -214,7 +214,30 @@ mod runtime {
evaluate_expr(symbol_table, sub_expr)
}
},
- ast::Expression::Binary(inner1, inner2) => todo!("[runtime] binary expressions"),
+ ast::Expression::Binary(inner1, inner2) => match inner1 {
+ ast::ExpressionInner::Expression(value_rc) => {
+ let sub_expr = &**value_rc;
+ evaluate_expr(symbol_table, sub_expr)
+ }
+ ast::ExpressionInner::Symbol(value) => {
+ let mut lhs_value_rc: Rc<Value>;
+
+ if let Some(builtin) = try_evaluate_builtin(value) {
+ lhs_value_rc = Rc::new(builtin);
+ } else if let Some(lookup) = symbol_table.get(value) {
+ lhs_value_rc = *lookup;
+ } else {
+ panic!("[runtime] symbol not defined: {:#?}", value);
+ }
+
+ let evaled_arg = evaluate_expr_inner(inner2);
+ try_apply_function(lhs_value_rc, evaled_arg, None)
+ }
+ other => unreachable!(
+ "[runtime] this should not be on the left side of a binary expression: {:#?}",
+ other
+ ),
+ },
}
// println!("[runtime] evaluating expression");