Skip to content

Commit

Permalink
fix some errors
Browse files Browse the repository at this point in the history
  • Loading branch information
nulluser0 committed Jun 18, 2024
1 parent b8f6c45 commit 1696d21
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 36 deletions.
2 changes: 1 addition & 1 deletion benches/interpret_factorial.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
2 changes: 1 addition & 1 deletion benches/run_factorial.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
})
Expand Down
25 changes: 13 additions & 12 deletions src/backend/environment.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Self, RuntimeError> {
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<Rc<RefCell<Environment>>, String> {
Expand Down
40 changes: 20 additions & 20 deletions src/backend/eval/expressions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
)),
}
}

Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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)) => {
Expand Down Expand Up @@ -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)) => {
Expand Down Expand Up @@ -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(),
}),
}
}
4 changes: 2 additions & 2 deletions src/bin/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand All @@ -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 {
Expand Down

0 comments on commit 1696d21

Please sign in to comment.