diff options
| author | Jan Tuomi <jans.tuomi@gmail.com> | 2021-11-24 22:47:23 +0200 |
|---|---|---|
| committer | Jan Tuomi <jans.tuomi@gmail.com> | 2021-11-25 09:53:55 +0200 |
| commit | 7f9207d9742c062c2a23ca53aa48420217558e7a (patch) | |
| tree | ffcc15beb0c26245c8aefd65b6206ce30df370ec /src/runtime.rs | |
| parent | 1baf725a38b90c13e5afacebd18fb3799a2bd081 (diff) | |
Recursion working oh yes
Diffstat (limited to 'src/runtime.rs')
| -rw-r--r-- | src/runtime.rs | 57 |
1 files changed, 45 insertions, 12 deletions
diff --git a/src/runtime.rs b/src/runtime.rs index 9e903cd..6eff337 100644 --- a/src/runtime.rs +++ b/src/runtime.rs @@ -183,34 +183,67 @@ pub fn reduce_term( } } Term::Builtin(_) => Ok((Rc::clone(&term_rc), 0)), - _ => todo!("reduce_term cases"), + Term::Lazy(symbol) => { + if resolve_lazy { + let table_lookup_value = symbol_table + .get(symbol) + .ok_or(format!("[runtime] symbol not defined: {}", symbol))?; + + // println!("Expanded {} into\n{}\n", symbol, *table_lookup_value); + Ok((Rc::clone(table_lookup_value), 1)) + } else { + Ok((term_rc, 0)) + } + } }?; Ok((result_term, result_n)) } -const MAX_REDUCTION_ITERATIONS: usize = 1000; +const MAX_REDUCTION_ITERATIONS: usize = 10000; pub fn repeatedly_reduce_term( symbol_table: &HashMap<String, Rc<Term>>, term_rc: Rc<Term>, bound_variable_opt: &Option<(usize, Rc<Term>)>, - resolve_lazy: bool, -) -> ReductionResult { +) -> Result<Rc<Term>, String> { let mut term = term_rc; let mut i: usize = 0; loop { + loop { + // println!("Reduce iteration #{}", i); + i += 1; + if i >= MAX_REDUCTION_ITERATIONS { + return Err("MAX_REDUCTION_ITERATIONS reached".to_owned()); + } + + let (result_term, substitution_n) = + reduce_term(&symbol_table, term.clone(), bound_variable_opt, false)?; + + if cfg!(feature = "debug") { + println!("i = {}:\n{}\n", i, result_term); + } + + if substitution_n > 0 { + term = result_term; + } else { + break; + } + } + + // Once resolve_lazy = false has stabilized, do one round of resolve_lazy = true + // println!("Reduce iteration #{}", i); i += 1; if i >= MAX_REDUCTION_ITERATIONS { return Err("MAX_REDUCTION_ITERATIONS reached".to_owned()); } - let (result_term, substitution_n) = reduce_term( - &symbol_table, - term.clone(), - bound_variable_opt, - resolve_lazy, - )?; + let (result_term, substitution_n) = + reduce_term(&symbol_table, term.clone(), bound_variable_opt, true)?; + + if cfg!(feature = "debug") { + println!("i = {}:\n{}\n", i, result_term); + } if substitution_n > 0 { term = result_term; @@ -218,7 +251,7 @@ pub fn repeatedly_reduce_term( break; } } - Ok((term, 0)) + Ok(term) } fn process_expr_inner_unary( @@ -349,7 +382,7 @@ pub fn process( } ast::Statement::Expression(expression) => { let term = process_expr(&symbol_table, expression, &vec![]); - let (result_term, _) = repeatedly_reduce_term(&symbol_table, term, &None, false)?; + let result_term = repeatedly_reduce_term(&symbol_table, term, &None)?; println!("[{}]: {}", index, result_term); output_terms.push(result_term); |
