use sexprs_data_structures::{car, cdr, AsSymbol, Value};
use sexprs_util::try_result;
use unique_pointer::UniquePointer;
use crate::helpers::runtime_error;
use crate::{Context, Result, Sym};
pub fn setq<'c>(
mut vm: UniquePointer<Context<'c>>,
list: Value<'c>,
) -> Result<Value<'c>> {
if list.len() % 2 != 0 {
return Err(runtime_error(
format!("odd number of arguments ({}) in setq: {:#?}", list.len(), list),
None,
));
}
let head = car(&list);
if !head.is_symbol() {
return Err(runtime_error(
format!("setq invoked with non-symbol: {:#?}", head),
None,
));
}
Ok(vm.set_local(&head.as_symbol(), &Sym::Value(car(&cdr(&list))))?)
}
pub fn defun<'c>(
mut vm: UniquePointer<Context<'c>>,
list: Value<'c>,
) -> Result<Value<'c>> {
let name = car(&list).as_symbol();
let args = car(&cdr(&list));
let body = cdr(&cdr(&list));
Ok(try_result!(vm.register_function(name, args, body)))
}