last_order_logic/
runtime.rs1use crate::*;
4use std::sync::Arc;
5
6pub fn reduce(expr: &Expr, defs: &[(Arc<String>, Expr)]) -> Expr {
8 let mut expr = expr.clone();
9 loop {
10 let mut found = false;
11 for (name, def) in defs.iter().rev() {
12 let (expr2, n) = expr.substitute(&Expr::Var(name.clone()), def);
13 if n > 0 {
14 expr = expr2;
15 found = true;
16 break;
17 }
18 }
19 if !found {break};
20 }
21 expr
22}
23
24pub fn data(
26 data_txt: &str,
27 defs: &mut Vec<(Arc<String>, Expr)>,
28 last_expr: &mut Option<Expr>,
29 last_import: &mut Option<String>,
30) {
31 match parsing::parse_data_str(data_txt) {
32 Ok(x) => {
33 for d in x.into_iter() {
34 match d {
35 parsing::Data::Expr(expr) => {
36 println!("{}", expr);
37 *last_expr = Some(expr);
38 }
39 parsing::Data::Def(name, expr) => {
40 println!("{} := {}", name, expr);
41 println!("LOL: Added `{}` to definitions", name);
42 defs.push((name, expr));
43 }
44 parsing::Data::Import(file_name) => {
45 use std::fs::File;
46 use std::io::Read;
47
48 let mut s = String::new();
49 let mut file = match File::open(&*file_name) {
50 Ok(x) => x,
51 Err(err) => {
52 eprintln!("Could not open `{}`, {}", file_name, err);
53 return;
54 }
55 };
56 file.read_to_string(&mut s).unwrap();
57 *last_import = Some(data_txt.to_string());
58 data(&s, defs, last_expr, last_import);
59 }
60 }
61 }
62 }
63 Err(err) => println!("ERROR:\n{}", err),
64 }
65}