Compare commits

..

No commits in common. "c3a73e3104447757942a53a440e68a3a0872f8ce" and "4102f5a35177da0f861daffff116b0aa7188085a" have entirely different histories.

2 changed files with 31 additions and 33 deletions

View file

@ -1,4 +1,5 @@
(print sum of 2 numbers) (print sum of 123 and 45)
o o
> 1230 B > 1230 B
vo A-+ vo A-+
@ -16,7 +17,8 @@ v> * 1 o ^
F -R0 * 4 B F -R0 * 4 B
*| # < -A8 v *| # < -A8 v
| # < | # <
#-| v < #|
-| v <
| *-| | *-|
F +B * ^ F +B * ^
#< \F---- #< \F----

View file

@ -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; use owo_colors::OwoColorize;
@ -15,6 +15,7 @@ struct Machine {
input: Vec<u8>, input: Vec<u8>,
input_index: usize, input_index: usize,
output: Vec<u8>, output: Vec<u8>,
state: State,
steps: usize, steps: usize,
} }
@ -78,6 +79,13 @@ enum Direction {
Right, Right,
} }
#[derive(Debug, Default, PartialEq)]
enum State {
#[default]
Running,
EndOfProgram,
}
fn main() { fn main() {
let args: Vec<_> = env::args().collect(); let args: Vec<_> = env::args().collect();
if args.len() <= 1 { if args.len() <= 1 {
@ -101,11 +109,9 @@ fn main() {
let mut interpreter = Machine::new(&source, input_data); let mut interpreter = Machine::new(&source, input_data);
print!("\x1B[2J"); // clear screen print!("\x1B[2J"); // clear screen
interpreter.show();
loop { loop {
print!(":> "); interpreter.show();
stdout().flush().unwrap();
let mut input_text = String::new(); let mut input_text = String::new();
stdin().read_line(&mut input_text).unwrap(); stdin().read_line(&mut input_text).unwrap();
let action: Vec<_> = input_text.trim().split_ascii_whitespace().collect(); let action: Vec<_> = input_text.trim().split_ascii_whitespace().collect();
@ -116,35 +122,18 @@ fn main() {
.unwrap_or(&input_text) .unwrap_or(&input_text)
.as_bytes()[6..], .as_bytes()[6..],
); );
interpreter.print_input();
continue; 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() { match action.as_slice() {
[] | ["step"] => { [] | ["step"] => interpreter.step_once(),
interpreter.step_once();
interpreter.show();
}
["dbg" | "debug"] => { ["dbg" | "debug"] => {
dbg!(&interpreter); dbg!(&interpreter);
} }
["step", num] => _ = num.parse().map(|n| interpreter.step(n)), ["step", num] => _ = num.parse().map(|n| interpreter.step(n)),
["run"] => interpreter.run(),
["q" | "exit" | "quit"] => break, ["q" | "exit" | "quit"] => break,
["h" | "help" | "?"] => {
println!("{}", HELP_TEXT.green()); _ => println!("{}", "unrecognised command".red()),
}
_ => println!("{}", "unrecognised command (try 'help')".red()),
} }
} }
} }
@ -159,12 +148,23 @@ impl Machine {
input, input,
input_index: 0, input_index: 0,
output: Vec::new(), output: Vec::new(),
state: State::default(),
steps: 0, steps: 0,
} }
} }
fn run(&mut self) {
while self.state == State::Running {
self.step_once();
self.show();
}
}
fn step(&mut self, n: usize) { fn step(&mut self, n: usize) {
for _ in 0..n { for _ in 0..n {
if self.state != State::Running {
break;
}
self.step_once(); self.step_once();
} }
} }
@ -230,7 +230,7 @@ impl Machine {
print!("{}", c.cyan()); print!("{}", c.cyan());
} }
} }
print!("."); print!(" :: ");
for (val, dir) in marbles_on_row { for (val, dir) in marbles_on_row {
print!("{}", format!("{}{} ", dir.char(), val).magenta()) print!("{}", format!("{}{} ", dir.char(), val).magenta())
} }
@ -239,14 +239,10 @@ impl Machine {
if !self.output.is_empty() { if !self.output.is_empty() {
println!("output: '{}'", String::from_utf8_lossy(&self.output)); println!("output: '{}'", String::from_utf8_lossy(&self.output));
} }
self.print_input();
println!("steps: {}", self.steps);
}
fn print_input(&self){
if !self.input.is_empty() { if !self.input.is_empty() {
println!("input: '{}'", String::from_utf8_lossy(&self.input)); println!("input: '{}'", String::from_utf8_lossy(&self.input));
} }
println!("steps: {}", self.steps);
} }
fn step_once(&mut self) { fn step_once(&mut self) {