diff --git a/benches/interpret_factorial.rs b/benches/interpret_factorial.rs index c5c696d..99bec1c 100644 --- a/benches/interpret_factorial.rs +++ b/benches/interpret_factorial.rs @@ -32,7 +32,7 @@ fn criterion_benchmark(c: &mut Criterion) { c.bench_function("interpret_factorial", |b| { b.iter(|| { let env = Rc::new(RefCell::new(Environment::new_with_parent(Rc::new( - RefCell::new(Environment::new()), + RefCell::new(Environment::default()), )))); let root_env = env .borrow() diff --git a/benches/run_factorial.rs b/benches/run_factorial.rs index e667afa..78183cb 100644 --- a/benches/run_factorial.rs +++ b/benches/run_factorial.rs @@ -20,7 +20,7 @@ fn criterion_benchmark(c: &mut Criterion) { c.bench_function("run_factorial", |b| { b.iter(|| { let env = Rc::new(RefCell::new(Environment::new_with_parent(Rc::new( - RefCell::new(Environment::new()), + RefCell::new(Environment::default()), )))); run(black_box(source_code.clone()), &env); }) diff --git a/src/backend/environment.rs b/src/backend/environment.rs index 67ddc2a..fe75e73 100644 --- a/src/backend/environment.rs +++ b/src/backend/environment.rs @@ -20,31 +20,32 @@ pub struct Environment { impl Default for Environment { fn default() -> Self { - Self::new() + Self::new().expect("Unable to create a new root Environment. This should not happen. If this still occur, please report this issue!") } } -fn setup_env(env: &mut Environment) { +fn setup_env(env: &mut Environment) -> Result<(), RuntimeError> { // Create Default Global Environment - env.declare_var("null", mk_null!(), false); - env.declare_var("true", mk_bool!(true), false); - env.declare_var("false", mk_bool!(false), false); + env.declare_var("null", mk_null!(), false)?; + env.declare_var("true", mk_bool!(true), false)?; + env.declare_var("false", mk_bool!(false), false)?; // Define a native built-in method - env.declare_var("println", mk_native_fn!(native_println), false); - env.declare_var("time", mk_native_fn!(native_time), false); - env.declare_var("forget", mk_native_fn!(native_forget), false); - env.declare_var("drop", mk_native_fn!(native_drop), false); + env.declare_var("println", mk_native_fn!(native_println), false)?; + env.declare_var("time", mk_native_fn!(native_time), false)?; + env.declare_var("forget", mk_native_fn!(native_forget), false)?; + env.declare_var("drop", mk_native_fn!(native_drop), false)?; + Ok(()) } impl Environment { - pub fn new() -> Self { + pub fn new() -> Result { let mut env = Environment { values: HashMap::new(), is_mutable: HashSet::new(), parent: None, }; - setup_env(&mut env); - env + setup_env(&mut env)?; + Ok(env) } pub fn get_parent(&self) -> Result>, String> { diff --git a/src/backend/eval/expressions.rs b/src/backend/eval/expressions.rs index c85fa1c..4ca0f0d 100644 --- a/src/backend/eval/expressions.rs +++ b/src/backend/eval/expressions.rs @@ -216,11 +216,9 @@ pub fn evaluate_member_expr( Some(result) => Ok(result.clone().unwrap_or(mk_null!())), None => Ok(mk_null!()), }, - _ => { - return Err(RuntimeError::RuntimeError( - "Cannot get a member of a non-object type.".to_string(), - )) - } + _ => Err(RuntimeError::RuntimeError( + "Cannot get a member of a non-object type.".to_string(), + )), } } @@ -279,11 +277,15 @@ pub fn evaluate_call_expr( .collect(); let evaluated_args = evaluated_args?; let scope = Rc::new(RefCell::new(Environment::new_with_parent(root_env.clone()))); - scope - .borrow_mut() - .declare_var(&fn_value.name, Val::Function(fn_value.clone()), false); + scope.borrow_mut().declare_var( + &fn_value.name, + Val::Function(fn_value.clone()), + false, + )?; for (varname, arg) in fn_value.parameters.iter().zip(evaluated_args.iter()) { - scope.borrow_mut().declare_var(varname, arg.clone(), false); + scope + .borrow_mut() + .declare_var(varname, arg.clone(), false)?; } let mut result: Val = mk_null!(); for stmt in &fn_value.body { @@ -368,7 +370,7 @@ pub fn evaluate_binary_op( BinaryOp::NotEqual => Ok(Val::Bool(BoolVal { value: l.value != r.value, })), - e => return Err(RuntimeError::UnsupportedBinaryOp(e)), + e => Err(RuntimeError::UnsupportedBinaryOp(e)), }, (Val::Float(l), Val::Float(r)) => { match op { @@ -405,7 +407,7 @@ pub fn evaluate_binary_op( BinaryOp::NotEqual => Ok(Val::Bool(BoolVal { value: l.value != r.value, })), - e => return Err(RuntimeError::UnsupportedBinaryOp(e)), + e => Err(RuntimeError::UnsupportedBinaryOp(e)), } } (Val::Integer(l), Val::Float(r)) => { @@ -443,7 +445,7 @@ pub fn evaluate_binary_op( BinaryOp::NotEqual => Ok(Val::Bool(BoolVal { value: l.to_float() != r.value, })), - e => return Err(RuntimeError::UnsupportedBinaryOp(e)), + e => Err(RuntimeError::UnsupportedBinaryOp(e)), } } (Val::Float(l), Val::Integer(r)) => { @@ -481,15 +483,13 @@ pub fn evaluate_binary_op( BinaryOp::NotEqual => Ok(Val::Bool(BoolVal { value: l.value != r.to_float(), })), - e => return Err(RuntimeError::UnsupportedBinaryOp(e)), + e => Err(RuntimeError::UnsupportedBinaryOp(e)), } } - e => { - return Err(RuntimeError::TypeError { - message: "Binary operations are only for integers and floats.".to_string(), - expected: ValueType::Integer, - found: e.0.get_type(), - }) - } + e => Err(RuntimeError::TypeError { + message: "Binary operations are only for integers and floats.".to_string(), + expected: ValueType::Integer, + found: e.0.get_type(), + }), } } diff --git a/src/bin/main.rs b/src/bin/main.rs index aa949d1..48e569e 100644 --- a/src/bin/main.rs +++ b/src/bin/main.rs @@ -49,7 +49,7 @@ fn run_file(file_path: &str) { } let env = Rc::new(RefCell::new(Environment::new_with_parent(Rc::new( - RefCell::new(Environment::new()), + RefCell::new(Environment::default()), )))); run(content, &env) } @@ -58,7 +58,7 @@ fn repl() { println!("QuikLang REPL v{}", env!("CARGO_PKG_VERSION")); let env = Rc::new(RefCell::new(Environment::new_with_parent(Rc::new( - RefCell::new(Environment::new()), + RefCell::new(Environment::default()), )))); loop {