amvm 0.1.0

Apika's My Virtual Machine. A virtual machine with Intermediate Lenguage
Documentation
use crate::runtime::{expr, AmvmResult};
use crate::{AmvmScope, CommandExpression, Value, VariableKind};

pub fn eval(scope: &mut AmvmScope, name: &Value, value: &CommandExpression) -> AmvmResult {
    let name = name
        .as_string()
        .expect("Variable name should be string")
        .clone();

    {
        let variable = scope
            .context
            .variables
            .get(&name)
            .unwrap_or_else(|| panic!("{name:?} is not defined"));

        let is_mutable = variable.read().unwrap().kind == VariableKind::Let;

        if !is_mutable {
            eprintln!("ERROR: Trying to mutate inmutable variable");
            std::process::exit(1);
        }
    }

    {
        let value = expr::eval(scope, value)?;

        let variable = scope
            .context
            .variables
            .get(&name)
            .unwrap_or_else(|| panic!("{name:?} is not defined"));

        let mut variable = variable.write().unwrap();
        variable.value = value;
    }

    Ok(Value::Null)
}