diff --git a/src/eval.rs b/src/eval.rs index 42a3637..d09dfa7 100644 --- a/src/eval.rs +++ b/src/eval.rs @@ -46,19 +46,19 @@ pub fn eval( // another check to detect if we may have a function call if let Ctr::Symbol(ref tok) = car { - match cdr { + match cdr.clone() { Ctr::Seg(ast) => { if let Some(func) = funcs.borrow().get(tok) { return func_call(func.clone(), ast.clone(), vars.clone(), funcs.clone()) - } else { - return Err(format!("Couldnt find function: {}.", tok)) + } else if !sym_loose { + return Err(format!("Couldnt find definition of {}.", tok)) } }, Ctr::None => { if let Some(func) = funcs.borrow().get(tok) { return func_call(func.clone(), new_ast(Ctr::None, Ctr::None), vars.clone(), funcs.clone()) - } else { - return Err(format!("Couldnt find function: {}.", tok)) + } else if !sym_loose { + return Err(format!("Couldnt find definition of {}.", tok)) } }, _ => return Err(format!("Arguments to function not a list!")) diff --git a/src/vars.rs b/src/vars.rs index 93181ad..f45cce7 100644 --- a/src/vars.rs +++ b/src/vars.rs @@ -49,7 +49,16 @@ pub fn get_export(env_cfg: bool) -> Function { let inner = a.borrow_mut(); match &inner.car { Ctr::Symbol(identifier) => { - define(b, identifier.to_string(), Rc::new(inner.cdr.clone())); + match inner.cdr.clone() { + Ctr::Seg(val) => { + let val_tmp = val.borrow().clone(); + define(b, identifier.to_string(), Rc::new(val_tmp.car)); + }, + + _ => { + eprintln!("impossible args to export"); + } + } return Ctr::None; }, _ => { diff --git a/tests/test_lib_vars.rs b/tests/test_lib_vars.rs index 7408cca..0715813 100644 --- a/tests/test_lib_vars.rs +++ b/tests/test_lib_vars.rs @@ -7,7 +7,7 @@ mod var_lib_tests { #[test] fn test_variable_export_and_lookup() { let doc1 = "(export test 1)"; - let doc2 = "(echo test)"; + let doc2 = "(concat test)"; let result = "1"; let vt = Rc::new(RefCell::new(VTable::new())); let ft: Rc>; @@ -34,6 +34,7 @@ mod var_lib_tests { }, Ok(ctr) => { + println!("{:#?}", vt); match ctr { Ctr::None => assert!(true), _ => assert!(false)