diff --git a/.gitignore b/.gitignore index ea8c4bf..1c589f7 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ /target +flamegraph.svg +perf.data diff --git a/examples/mandelbrot.puyo b/examples/mandelbrot.puyo index e291c9a..c52749e 100644 --- a/examples/mandelbrot.puyo +++ b/examples/mandelbrot.puyo @@ -45,11 +45,11 @@ ymin ->y0 (64 iter + put) ite - x0 0.03 + ->x0 + x0 0.0055 + ->x0 ) while! 10 put - y0 0.08 + ->y0 + y0 0.021 + ->y0 xmin ->x0 ) while! diff --git a/src/eval.rs b/src/eval.rs index ab776d1..459104d 100644 --- a/src/eval.rs +++ b/src/eval.rs @@ -45,11 +45,11 @@ impl<'a> Val<'a> { } } - fn call(&self, stack: &mut Stack<'a>) { + fn call(&self, stack: &mut Stack<'a>, out: &mut impl io::Write) { match self { Val::Num(n) => stack.push(Val::Num(*n)), Val::Fun { insts, env } => { - eval(insts, stack, &env.clone()); + eval(insts, stack, &env.clone(), out); } } } @@ -184,7 +184,12 @@ impl<'a> Stack<'a> { } } -fn eval<'a>(insts: &'a [Inst<'a>], stack: &mut Stack<'a>, env: &Rc>>) { +fn eval<'a>( + insts: &'a [Inst<'a>], + stack: &mut Stack<'a>, + env: &Rc>>, + out: &mut impl io::Write, +) { for i in insts { match i { Inst::Set(var) => env.borrow_mut().set(var, stack.pop_default()), @@ -216,15 +221,15 @@ fn eval<'a>(insts: &'a [Inst<'a>], stack: &mut Stack<'a>, env: &Rc { - print!("{}", stack.pop_default()); + write!(out, "{}", stack.pop_default()).unwrap(); } "println" => { - println!("{}", stack.pop_default()); + writeln!(out, "{}", stack.pop_default()).unwrap(); } "put" => { #[allow(clippy::cast_sign_loss, clippy::cast_possible_truncation)] let byte = stack.pop_num() as u8; - io::stdout().write_all(&[byte]).unwrap(); + out.write_all(&[byte]).unwrap(); } "explode" => { eprintln!("I ESPLODED"); @@ -240,9 +245,9 @@ fn eval<'a>(insts: &'a [Inst<'a>], stack: &mut Stack<'a>, env: &Rc stack.push( @@ -254,7 +259,7 @@ fn eval<'a>(insts: &'a [Inst<'a>], stack: &mut Stack<'a>, env: &Rc stack.push(Val::Num(*n)), Inst::Call => { let f = stack.pop_default(); - f.call(stack); + f.call(stack, out); } Inst::Block(insts) => stack.push(Val::Fun { insts, @@ -267,7 +272,12 @@ fn eval<'a>(insts: &'a [Inst<'a>], stack: &mut Stack<'a>, env: &Rc]) { +pub fn run(insts: &[Inst<'_>], out: &mut impl io::Write) { let mut stack = Stack::new(); - eval(insts, &mut stack, &Rc::new(RefCell::new(Env::default()))); + eval( + insts, + &mut stack, + &Rc::new(RefCell::new(Env::default())), + out, + ); } diff --git a/src/main.rs b/src/main.rs index 3b4ae76..6b09c95 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,5 +12,5 @@ fn main() { let insts = parse(&src); eprintln!("{}!", Inst::Block(insts.clone())); - run(&insts); + run(&insts, &mut io::BufWriter::new(io::stdout().lock())); }