diff options
| -rw-r--r-- | rust/TODO | 10 | ||||
| -rw-r--r-- | rust/notes.txt | 3 | ||||
| -rw-r--r-- | rust/spectrum.rs | 33 | 
3 files changed, 30 insertions, 16 deletions
diff --git a/rust/TODO b/rust/TODO new file mode 100644 index 0000000..6198755 --- /dev/null +++ b/rust/TODO @@ -0,0 +1,10 @@ +- basic tests +- fold in norvig's "lispy2" additions http://norvig.com/lispy2.html +- fix quote (should take an expr, not a list?) +- fix cond/cdr behavior working right; also empty tuple +- get minimal.scm to run +- if let +- use getopt +? multi-part lambdas +? apply +? re-write runge kutta with lists, not vectors diff --git a/rust/notes.txt b/rust/notes.txt new file mode 100644 index 0000000..cc35cdf --- /dev/null +++ b/rust/notes.txt @@ -0,0 +1,3 @@ +https://mgattozzi.github.io/2016/11/08/scheme-input.html + +see also: tail recursion notes impl notes from norvig diff --git a/rust/spectrum.rs b/rust/spectrum.rs index ecc00d2..73ba59d 100644 --- a/rust/spectrum.rs +++ b/rust/spectrum.rs @@ -757,8 +757,9 @@ fn repl(verbose: bool, top_env: &mut HashMap<String, SchemeExpr>) {      }  } -/* This loads and evals the hard-coded prelude file (which is just scheme expressions compiled into - * the executable), saving the resulting defines in top_env. +/* Loads and evals the hard-coded prelude file (which is just scheme + * expressions compiled into the executable), saving the resulting defines in + # top_env.   */  fn import_prelude(top_env: &mut HashMap<String, SchemeExpr>) -> Result<(), String> { @@ -778,8 +779,10 @@ fn import_file(fpath: &Path, top_env: &mut HashMap<String, SchemeExpr>) -> Resul      let mut f = File::open(fpath)          .expect(&format!("couldn't open file: {}", &fpath.to_str().unwrap())); +      f.read_to_end(&mut raw_bytes)          .expect(&format!("couldn't read file: {}", &fpath.to_str().unwrap())); +      let contents = String::from_utf8(raw_bytes)          .expect(&format!("UTF-8 decode error reading file: {}", &fpath.to_str().unwrap())); @@ -792,13 +795,13 @@ fn import_file(fpath: &Path, top_env: &mut HashMap<String, SchemeExpr>) -> Resul  }  fn usage() { -    println!("usage:\tspectrum [-h] [-v] [--no-repl] [--no-prelude] [<files>]"); -    println!(""); -    println!("Files will be loaded in order, then drop to REPL (unless \"--no-repl\" is passed)."); -    println!("Verbose flag (\"-v\") will result in lexed tokens and parsed AST \ -        being dumped to stdout (when on REPL)."); -    println!("A \"prelude\" of common Scheme/LISP functions (eg, cdaddr) will \ -        be loaded before any files (unless \"--no-prelude\" is passed)."); +    println!( +r#"usage:\tspectrum [-h] [-v] [--no-repl] [--no-prelude] [<files>] + +Files will be loaded in order, then drop to REPL (unless "--no-repl" is passed). +Verbose flag ("-v") will result in lexed tokens and parsed AST being dumped to stdout (when on REPL). +A "prelude" of common Scheme/LISP functions (eg, cdaddr) will be loaded before any files (unless "--no-prelude" is passed). +"#);  }  fn main() { @@ -806,7 +809,6 @@ fn main() {      let mut verbose: bool = false;      let mut no_repl: bool = false;      let mut no_prelude: bool = false; -    let mut top_env = HashMap::<String, SchemeExpr>::new();      let mut file_list = Vec::<String>::new(); @@ -828,6 +830,8 @@ fn main() {          }      } +    let mut top_env = HashMap::<String, SchemeExpr>::new(); +      if !no_prelude {          import_prelude(&mut top_env).unwrap();      } @@ -839,12 +843,9 @@ fn main() {              return;          }          println!("Loading {}...", fname); -        match import_file(&fpath, &mut top_env) { -            Err(e) => { -                println!("Error loading file: {}\n    {}", fname, e); -                return; -            }, -            Ok(_) => () +        if let Err(e) = import_file(&fpath, &mut top_env) { +            println!("Error loading file: {}\n    {}", fname, e); +            return;          }      }  | 
