From f22d807b57034b5e4b631e06bb19f2a60b7bba3c Mon Sep 17 00:00:00 2001 From: Ava Hahn Date: Mon, 6 Mar 2023 15:50:02 -0800 Subject: [PATCH] added env function and test --- Readme.org | 4 +++- src/stl.rs | 11 +++++++++++ src/stl/decl.rs | 21 +++++++++++++++++++++ src/sym.rs | 4 ++++ tests/test_vars.rs | 16 ++++++++++++++++ 5 files changed, 55 insertions(+), 1 deletion(-) diff --git a/Readme.org b/Readme.org index b6b385e..3e98801 100644 --- a/Readme.org +++ b/Readme.org @@ -36,10 +36,13 @@ https://matrix.to/#/#vomitorium:matrix.sunnypup.io *** TODO Easy patterns **** TODO while-let combo **** TODO main loop application +**** TODO let destructuring +**** TODO if-set? *** TODO Builtin functions *** TODO Documentation **** TODO Tests **** TODO Help function +**** TODO Env function **** TODO Snippets directory ** Configuration @@ -136,7 +139,6 @@ This contains any executable target of this project. Notably the main shell file Note: this section will not show the status of each item unless you are viewing it with a proper orgmode viewer. Note: this section only tracks the state of incomplete TODO items. Having everything on here would be cluttered. -*** TODO Eval function *** TODO Input function *** TODO Env function *** TODO Load (load a script) function diff --git a/src/stl.rs b/src/stl.rs index 33388b4..b2c82d3 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -172,6 +172,17 @@ pub fn static_stdlib(syms: &mut SymTable) -> Result<(), String> { }, ); + syms.insert( + "env".to_string(), + Symbol { + name: String::from("env"), + args: Args::None, + conditional_branches: false, + docs: decl::ENV_DOCSTRING.to_string(), + value: ValueType::Internal(Rc::new(decl::env_callback)), + }, + ); + Ok(()) } diff --git a/src/stl/decl.rs b/src/stl/decl.rs index ff3f556..17a9ab7 100644 --- a/src/stl/decl.rs +++ b/src/stl/decl.rs @@ -189,3 +189,24 @@ pub fn isset_callback(ast: &Seg, syms: &mut SymTable) -> Result { } } } + +pub const ENV_DOCSTRING: &str = "takes no arguments +prints out all available symbols and their associated values"; + +pub fn env_callback(_ast: &Seg, syms: &mut SymTable) -> Result { + let mut functions = vec![]; + println!("VARIABLES:"); + for (name, val) in syms.iter() { + match val.value { + ValueType::VarForm(_) => { + println!(" {}: {}", &name, val.value); + }, + _ => functions.push(name.clone()), + } + } + println!("FUNCTIONS:"); + for func in functions { + println!(" {}", func); + } + Ok(Ctr::None) +} diff --git a/src/sym.rs b/src/sym.rs index b92dc42..077d0fc 100644 --- a/src/sym.rs +++ b/src/sym.rs @@ -87,6 +87,10 @@ impl SymTable { self.0.remove(arg) } + pub fn iter(&self) -> std::collections::hash_map::Iter<'_, String, Symbol> { + self.0.iter() + } + pub fn call_symbol( &mut self, name: &String, diff --git a/tests/test_vars.rs b/tests/test_vars.rs index 8bac65f..818b108 100644 --- a/tests/test_vars.rs +++ b/tests/test_vars.rs @@ -249,4 +249,20 @@ mod var_lib_tests { assert!(!b); } } + + #[test] + fn test_env_doesnt_lose_elements() { + let doc1 = "(def t '' 1)"; + let doc2 = "(env)"; + let doc3 = "t"; + let mut syms = SymTable::new(); + static_stdlib(&mut syms).unwrap(); + dynamic_stdlib(&mut syms).unwrap(); + let set_tree = lex(&doc1.to_string()).unwrap(); + let env_tree = lex(&doc2.to_string()).unwrap(); + let tst_tree = lex(&doc3.to_string()).unwrap(); + eval(&set_tree, &mut syms).unwrap(); + eval(&env_tree, &mut syms).unwrap(); + eval(&tst_tree, &mut syms).unwrap(); + } }