From f9f5cb40e91815fe1e1d04f4ddee685d99c2be6d Mon Sep 17 00:00:00 2001 From: minneelyyyy Date: Tue, 15 Oct 2024 00:47:20 -0400 Subject: [PATCH] new Runtime object --- examples/repl.rs | 4 +++- src/executor.rs | 2 +- src/lib.rs | 34 +++++++++++++++++++++++++++++++--- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/examples/repl.rs b/examples/repl.rs index e978730..88460f5 100644 --- a/examples/repl.rs +++ b/examples/repl.rs @@ -1,7 +1,9 @@ use std::io::{self, BufReader}; fn main() { - for value in lamm::evaluate(BufReader::new(io::stdin())) { + let runtime = lamm::Runtime::new(BufReader::new(io::stdin())); + + for value in runtime.values() { match value { Ok(v) => println!("{v}"), Err(e) => eprintln!("{e}"), diff --git a/src/executor.rs b/src/executor.rs index 49e3bd5..4ab92fb 100644 --- a/src/executor.rs +++ b/src/executor.rs @@ -326,7 +326,7 @@ where ParseTree::StringCast(x) => Ok(Value::String(format!("{}", self.exec(x, locals)?))), ParseTree::Print(x) => match self.exec(x, locals)? { x => { - writeln!(self.stdout, "{x}").map_err(|e| RuntimeError::IO(e)); + writeln!(self.stdout, "{x}").map_err(|e| RuntimeError::IO(e))?; Ok(Value::Nil) } } diff --git a/src/lib.rs b/src/lib.rs index 2173d49..db1e335 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,8 +3,12 @@ mod tokenizer; mod parser; mod executor; +use executor::{Executor, RuntimeError}; +use parser::Parser; +use tokenizer::Tokenizer; + use std::fmt::Display; -use std::io::BufRead; +use std::io::{Write, Read, BufRead}; #[derive(Clone, Debug)] pub enum Type { @@ -72,6 +76,30 @@ pub(crate) struct FunctionDeclaration { args: Vec<(String, Type)>, } -pub fn evaluate(r: R) -> impl Iterator> { - executor::Executor::new(parser::Parser::new(tokenizer::Tokenizer::new(r))) +pub struct Runtime<'a, R: BufRead> { + inner: executor::Executor<'a, parser::Parser>> +} + +impl<'a, R: BufRead> Runtime<'a, R> { + pub fn new(reader: R) -> Self { + Self { + inner: Executor::new(Parser::new(Tokenizer::new(reader))) + } + } + + pub fn stdout(self, stdout: impl Write + 'a) -> Self { + Self { + inner: self.inner.stdout(stdout) + } + } + + pub fn stdin(self, stdin: impl Read + 'a) -> Self { + Self { + inner: self.inner.stdin(stdin) + } + } + + pub fn values(self) -> impl Iterator> + use<'a, R> { + self.inner + } }