last_order_logic/
runtime.rs

1//! Runtime.
2
3use crate::*;
4use std::sync::Arc;
5
6/// Reduces expression using definitions.
7pub 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
24/// Handle data.
25pub 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}