sexprs-vm 0.0.5

sexprs is a minimal lisp dialect to evaluate written in Rust.
Documentation
//BinaryHeap;

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>> {
    // info!(202, "setq");
    // let list = vm.eval_list_as_items(list)?;
    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,
        ));
    }
    // dbg!(&head, &tail, &list);
    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));
    // info!(184, "defun");
    // dbg!(&name, &args, &body);
    Ok(try_result!(vm.register_function(name, args, body)))
}