/ src / main.rs
main.rs
 1  use std::{fs::File, io::Read, path::PathBuf, rc::Rc};
 2  
 3  use hlambda::{
 4      ast::*,
 5      eval::{DefaultIOImpl, Globals, Term, Val},
 6  };
 7  
 8  use clap::Parser;
 9  #[derive(Parser)]
10  #[command(version, about, long_about = None)]
11  struct Cli {
12      #[arg()]
13      file: PathBuf,
14  }
15  
16  fn main() {
17      let Cli { file } = Cli::parse();
18      let mut content = String::new();
19      File::open(file)
20          .unwrap()
21          .read_to_string(&mut content)
22          .unwrap();
23      let (rest, ast) = parse_expr(&content).unwrap();
24      println!("{ast:#?}");
25      if !rest.trim().is_empty() {
26          println!("Did not parse:\n{rest}");
27      }
28      println!("Evaluating...");
29  
30      let globals = Globals::new_with_io();
31  
32      let term = Term::from_ast_with_globals(ast, &globals).unwrap();
33      println!("{term:#?}");
34      let res = term.eval(&globals).unwrap();
35      let res = Rc::unwrap_or_clone(res);
36      println!("{res:#?}");
37      if let Val::IO(io) = res {
38          io.exec(&DefaultIOImpl).unwrap();
39      }
40      // let mut ctx = Context::default();
41  
42      // ctx.register("print", |_ctx, v| match v {
43      //     Value::Str(s) => {
44      //         print!("{s}");
45      //         Ok(Value::IO(Box::new(Value::Unit)))
46      //     }
47      //     Value::Int(i) => {
48      //         print!("{i}");
49      //         Ok(Value::IO(Box::new(Value::Unit)))
50      //     }
51      //     _ => Err(EvalError::InvalidArgument),
52      // })
53      // .unwrap();
54      // ctx.register("println", |_ctx, v| match v {
55      //     Value::Str(s) => {
56      //         println!("{s}");
57      //         Ok(Value::IO(Box::new(Value::Unit)))
58      //     }
59      //     Value::Int(i) => {
60      //         println!("{i}");
61      //         Ok(Value::IO(Box::new(Value::Unit)))
62      //     }
63      //     _ => Err(EvalError::InvalidArgument),
64      // })
65      // .unwrap();
66      // ctx.register("input", |_ctx, v| match v {
67      //     Value::Unit => {
68      //         let mut res = String::new();
69      //         stdin().read_line(&mut res)?;
70      //         while res.ends_with("\n") {
71      //             res.pop();
72      //         }
73      //         Ok(Value::IO(Box::new(Value::Str(res.into()))))
74      //     }
75      //     _ => Err(EvalError::InvalidArgument),
76      // })
77      // .unwrap();
78      // ctx.register("bind", |_ctx, v| match v {
79      //     Value::IO(lhs) => {
80      //         // eprintln!("Binding {lhs:?}");
81      //         Ok(Value::Internal(Some(lhs), |lhs, f| {
82      //             let lhs = lhs.ok_or(EvalError::InvalidState)?;
83      //             match f {
84      //                 Value::Function(ctx, var, expr) => eval(expr, ctx.with_value(var, *lhs)),
85      //                 Value::Internal(ctx, f) => f(ctx, *lhs),
86      //                 _ => Err(EvalError::InvalidArgument),
87      //             }
88      //         }))
89      //     }
90      //     _ => Err(EvalError::InvalidArgument),
91      // })
92      // .unwrap();
93  
94      // let val = eval(&ast, Rc::new(ctx));
95      // println!("{val:?}");
96  }