diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..394c6c5 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "rust-mal" +version = "0.1.0" diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..8a518d1 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,19 @@ +// io lib to read input and print output +use std::io::{self, Write}; + +mod step0_repl; +use step0_repl::rep; + +fn main() -> io::Result<()> { + loop { + print!("user> "); + // Flush the prompt to appear before command + let _ = io::stdout().flush(); + + let mut input = String::new(); + + io::stdin().read_line(&mut input)?; + + print!("{}", rep(&input)); + } +} diff --git a/src/step0_repl.rs b/src/step0_repl.rs new file mode 100644 index 0000000..d9513d6 --- /dev/null +++ b/src/step0_repl.rs @@ -0,0 +1,29 @@ +// Structure the main functions of the interpreter +// +// For now just act as an echo, note that each function should not modify the +// input, thus this can be referenced by the previous step without the need +// to allocate more memory + +#[allow(non_snake_case)] +/// Read input and generate an ast +fn READ(input: &str) -> String { + input.to_string() +} + +#[allow(non_snake_case)] +/// Evaluate the generated ast +fn EVAL(input: &str) -> String { + input.to_string() +} + +#[allow(non_snake_case)] +/// Print out the result of the evaluation +fn PRINT(input: &str) -> String { + input.to_string() +} + +pub fn rep(input: &str) -> String { + let ast = READ(input); + let result = EVAL(&ast); + PRINT(&result) +}