schemers/src/main.rs

65 lines
1.7 KiB
Rust
Raw Permalink Normal View History

2021-05-30 16:19:35 +02:00
mod environment;
mod interpreter;
2021-05-16 00:04:54 +02:00
mod lexer;
2021-05-16 19:04:55 +02:00
mod parser;
mod primitives;
use std::env;
2021-05-30 17:57:59 +02:00
use std::fs;
2021-05-30 16:19:35 +02:00
use std::io;
use std::io::prelude::*;
2021-05-30 17:57:59 +02:00
use std::path::Path;
2021-05-16 00:04:54 +02:00
2021-05-30 16:19:35 +02:00
fn repl() {
let mut env = environment::get_global_environment();
loop {
let mut input = String::new();
print!(" ]=> ");
io::stdout().flush().ok().expect("Could not flush stdout");
match io::stdin().read_line(&mut input) {
Ok(_) => {
let tokens = lexer::read(&input);
let datum = parser::parse(tokens);
let result = interpreter::interpret(&datum, &mut env);
println!("{:?}", result);
}
Err(error) => println!("error: {}", error),
}
}
}
fn interpret_code(scm_code: &str) {
2021-05-16 19:04:55 +02:00
let tokens = lexer::read(scm_code);
let datum = parser::parse(tokens);
2021-05-29 17:29:27 +02:00
let mut env = environment::get_global_environment();
let result = interpreter::interpret(&datum, &mut env);
2021-05-20 20:11:32 +02:00
println!("{:?}", result);
2021-05-15 15:38:06 +02:00
}
2021-05-30 16:19:35 +02:00
fn interpret_file(filename: &Path) {
match fs::read_to_string(filename) {
Ok(scm_code) => {
let tokens = lexer::read(scm_code.as_str());
let datum = parser::parse(tokens);
let mut env = environment::get_global_environment();
let _result = interpreter::interpret(&datum, &mut env);
// println!("{:?}", result);
2021-05-30 17:57:59 +02:00
}
Err(error) => println!("error: {} {:?}", error, filename),
}
}
2021-05-30 16:19:35 +02:00
fn main() {
let args: Vec<String> = env::args().collect();
let scm_code = "";
2021-05-30 16:19:35 +02:00
if args.len() == 2 {
let arg_path = Path::new(&args[1]);
interpret_file(arg_path);
} else if scm_code.len() > 0 {
interpret_code(scm_code);
2021-05-30 16:19:35 +02:00
} else {
repl();
}
}