diff options
author | Vincent Ambo <mail@tazj.in> | 2020-11-22T23·59+0100 |
---|---|---|
committer | tazjin <mail@tazj.in> | 2020-11-23T01·15+0000 |
commit | 9d2b001c4cc86cc57bdb890037c80b7a1c766ecd (patch) | |
tree | d35779a3761fcdbf435bbc60d9725ea9cc5a04d1 /users/tazjin/rlox/src/main.rs | |
parent | 0618ff11ccf50fd6e8a6e0bd7820f19b100ca44a (diff) |
feat(tazjin/rlox): Add basic program structure r/1913
... as well as a Nix derivation, because why not. Change-Id: Iaf2591ab72676fe0732c3f807b3aa0cff13fb4ef Reviewed-on: https://cl.tvl.fyi/c/depot/+/2143 Reviewed-by: tazjin <mail@tazj.in> Tested-by: BuildkiteCI
Diffstat (limited to 'users/tazjin/rlox/src/main.rs')
-rw-r--r-- | users/tazjin/rlox/src/main.rs | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/users/tazjin/rlox/src/main.rs b/users/tazjin/rlox/src/main.rs index 3f173673a177..83d220c81631 100644 --- a/users/tazjin/rlox/src/main.rs +++ b/users/tazjin/rlox/src/main.rs @@ -1,23 +1,40 @@ -use std::process; use std::env; +use std::fs; +use std::io; +use std::io::Write; +use std::process; -fn run_file(_file: &str) { - unimplemented!("no file support yet") -} - -fn run_prompt() { - unimplemented!("no prompt support yet") -} +mod interpreter; fn main() { let mut args = env::args(); - if args.len() > 1 { + if args.len() > 2 { println!("Usage: rlox [script]"); process::exit(1); - } else if let Some(file) = args.next() { + } else if let Some(file) = args.nth(1) { run_file(&file); } else { run_prompt(); } } + +// Run Lox code from a file and print results to stdout +fn run_file(file: &str) { + let contents = fs::read_to_string(file).expect("failed to read the input file"); + interpreter::run(&contents); +} + +// Evaluate Lox code interactively in a shitty REPL. +fn run_prompt() { + let mut line = String::new(); + + loop { + print!("> "); + io::stdout().flush().unwrap(); + io::stdin() + .read_line(&mut line) + .expect("failed to read user input"); + interpreter::run(&line); + } +} |