mirror of
https://github.com/PaddiM8/kalker.git
synced 2025-02-04 02:49:12 +01:00
Optimised 'sum' function
This commit is contained in:
parent
1cc0b93627
commit
0ce06d96b9
@ -11,6 +11,7 @@ pub struct Context<'a> {
|
|||||||
symbol_table: &'a mut SymbolTable,
|
symbol_table: &'a mut SymbolTable,
|
||||||
angle_unit: String,
|
angle_unit: String,
|
||||||
precision: u32,
|
precision: u32,
|
||||||
|
sum_n_value: Option<i128>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Context<'a> {
|
impl<'a> Context<'a> {
|
||||||
@ -19,6 +20,7 @@ impl<'a> Context<'a> {
|
|||||||
angle_unit: angle_unit.into(),
|
angle_unit: angle_unit.into(),
|
||||||
symbol_table,
|
symbol_table,
|
||||||
precision,
|
precision,
|
||||||
|
sum_n_value: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -203,6 +205,12 @@ fn eval_var_expr(
|
|||||||
return eval_expr(context, &Expr::Literal(*value), unit);
|
return eval_expr(context, &Expr::Literal(*value), unit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if identifier == "n" {
|
||||||
|
if let Some(value) = context.sum_n_value {
|
||||||
|
return Ok(KalkNum::from(value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Look for the variable in the symbol table
|
// Look for the variable in the symbol table
|
||||||
let var_decl = context.symbol_table.get_var(identifier).cloned();
|
let var_decl = context.symbol_table.get_var(identifier).cloned();
|
||||||
match var_decl {
|
match var_decl {
|
||||||
@ -266,13 +274,7 @@ fn eval_fn_call_expr(
|
|||||||
let mut sum = Float::with_val(context.precision, 0);
|
let mut sum = Float::with_val(context.precision, 0);
|
||||||
|
|
||||||
for n in start..=end {
|
for n in start..=end {
|
||||||
let n_expr = Expr::Literal(n as f64);
|
context.sum_n_value = Some(n);
|
||||||
|
|
||||||
// Update the variable "n" in the symbol table on every iteration,
|
|
||||||
// then calculate the expression and add it to the total sum.
|
|
||||||
context
|
|
||||||
.symbol_table
|
|
||||||
.set(Stmt::VarDecl(String::from("n"), Box::new(n_expr)));
|
|
||||||
sum += eval_expr(context, &expressions[2], "")?.value;
|
sum += eval_expr(context, &expressions[2], "")?.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -180,6 +180,12 @@ impl From<f32> for KalkNum {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<i128> for KalkNum {
|
||||||
|
fn from(x: i128) -> Self {
|
||||||
|
KalkNum::new(Float::with_val(63, x), "")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<i64> for KalkNum {
|
impl From<i64> for KalkNum {
|
||||||
fn from(x: i64) -> Self {
|
fn from(x: i64) -> Self {
|
||||||
KalkNum::new(Float::with_val(63, x), "")
|
KalkNum::new(Float::with_val(63, x), "")
|
||||||
|
Loading…
Reference in New Issue
Block a user