diff --git a/programs/adder.mbl b/programs/adder.mbl index c728ce2..4657b31 100644 --- a/programs/adder.mbl +++ b/programs/adder.mbl @@ -1,4 +1,5 @@ -(print sum of 2 numbers) +(print sum of 123 and 45) + o > 1230 B vo A-+ @@ -16,7 +17,8 @@ v> * 1 o ^ F -R0 * 4 B *| # < -A8 v | # < -#-| v < +#| + -| v < | *-| F +B * ^ #< \F---- diff --git a/src/main.rs b/src/main.rs index a0911b4..3a633e9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use std::{env, fs, io::{stdin, stdout, Write}, process::exit}; +use std::{env, fs, io::stdin, process::exit}; use owo_colors::OwoColorize; @@ -15,6 +15,7 @@ struct Machine { input: Vec, input_index: usize, output: Vec, + state: State, steps: usize, } @@ -78,6 +79,13 @@ enum Direction { Right, } +#[derive(Debug, Default, PartialEq)] +enum State { + #[default] + Running, + EndOfProgram, +} + fn main() { let args: Vec<_> = env::args().collect(); if args.len() <= 1 { @@ -101,11 +109,9 @@ fn main() { let mut interpreter = Machine::new(&source, input_data); print!("\x1B[2J"); // clear screen - interpreter.show(); loop { - print!(":> "); - stdout().flush().unwrap(); + interpreter.show(); let mut input_text = String::new(); stdin().read_line(&mut input_text).unwrap(); let action: Vec<_> = input_text.trim().split_ascii_whitespace().collect(); @@ -116,35 +122,18 @@ fn main() { .unwrap_or(&input_text) .as_bytes()[6..], ); - interpreter.print_input(); continue; } - - const HELP_TEXT:&str = r#"\n | step - - step once -step [n] - - step n times -input [text] - - append text to the input buffer -dbg | debug - - debug print interpreter state -q | quit | exit - - exit to terminal -"#; match action.as_slice() { - [] | ["step"] => { - interpreter.step_once(); - interpreter.show(); - } + [] | ["step"] => interpreter.step_once(), ["dbg" | "debug"] => { dbg!(&interpreter); } ["step", num] => _ = num.parse().map(|n| interpreter.step(n)), + ["run"] => interpreter.run(), ["q" | "exit" | "quit"] => break, - ["h" | "help" | "?"] => { - println!("{}", HELP_TEXT.green()); - } - _ => println!("{}", "unrecognised command (try 'help')".red()), + + _ => println!("{}", "unrecognised command".red()), } } } @@ -159,12 +148,23 @@ impl Machine { input, input_index: 0, output: Vec::new(), + state: State::default(), steps: 0, } } + fn run(&mut self) { + while self.state == State::Running { + self.step_once(); + self.show(); + } + } + fn step(&mut self, n: usize) { for _ in 0..n { + if self.state != State::Running { + break; + } self.step_once(); } } @@ -230,7 +230,7 @@ impl Machine { print!("{}", c.cyan()); } } - print!("."); + print!(" :: "); for (val, dir) in marbles_on_row { print!("{}", format!("{}{} ", dir.char(), val).magenta()) } @@ -239,14 +239,10 @@ impl Machine { if !self.output.is_empty() { println!("output: '{}'", String::from_utf8_lossy(&self.output)); } - self.print_input(); - println!("steps: {}", self.steps); - } - - fn print_input(&self){ if !self.input.is_empty() { println!("input: '{}'", String::from_utf8_lossy(&self.input)); } + println!("steps: {}", self.steps); } fn step_once(&mut self) {