From 8d6915f69a68ad3fefc46e5bca541134552597bb Mon Sep 17 00:00:00 2001 From: Ava Hahn Date: Mon, 6 Mar 2023 15:25:23 -0800 Subject: [PATCH] add isset Signed-off-by: Ava Hahn --- src/stl.rs | 30 ++++++++++++++++++++++++++++++ tests/test_vars.rs | 27 +++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/src/stl.rs b/src/stl.rs index 0a57978..38071c7 100644 --- a/src/stl.rs +++ b/src/stl.rs @@ -162,6 +162,17 @@ pub fn static_stdlib(syms: &mut SymTable) -> Result<(), String> { }, ); + syms.insert( + "set?".to_string(), + Symbol { + name: String::from("set?"), + args: Args::Strict(vec![Type::Symbol]), + conditional_branches: true, + docs: ISSET_DOCSTRING.to_string(), + value: ValueType::Internal(Rc::new(_isset_callback)), + }, + ); + Ok(()) } @@ -356,3 +367,22 @@ fn _store_callback(ast: &Seg, syms: &mut SymTable, env_cfg: bool) -> Result Result { + if ast.len() != 1 { + Err("help only takes a single argument".to_string()) + } else { + if let Ctr::Symbol(ref symbol) = *ast.car { + if let Some(_) = syms.get(symbol) { + Ok(Ctr::Bool(true)) + } else { + Ok(Ctr::Bool(false)) + } + } else { + Err("help should only be called on a symbol".to_string()) + } + } +} diff --git a/tests/test_vars.rs b/tests/test_vars.rs index 52f9ff3..8bac65f 100644 --- a/tests/test_vars.rs +++ b/tests/test_vars.rs @@ -222,4 +222,31 @@ mod var_lib_tests { assert!(false); } } + + #[test] + fn test_isset_true() { + let doc1 = "(def test '' 1)"; + let doc2 = "(set? test)"; + let mut syms = SymTable::new(); + static_stdlib(&mut syms).unwrap(); + dynamic_stdlib(&mut syms).unwrap(); + let def_tree = lex(&doc1.to_string()).unwrap(); + let set_tree = lex(&doc2.to_string()).unwrap(); + eval(&def_tree, &mut syms).unwrap(); + if let Ctr::Bool(b) = *eval(&set_tree, &mut syms).unwrap() { + assert!(b); + } + } + + #[test] + fn test_isset_false() { + let doc = "(set? test)"; + let mut syms = SymTable::new(); + static_stdlib(&mut syms).unwrap(); + dynamic_stdlib(&mut syms).unwrap(); + let set_tree = lex(&doc.to_string()).unwrap(); + if let Ctr::Bool(b) = *eval(&set_tree, &mut syms).unwrap() { + assert!(!b); + } + } }