scheme4r 0.2.1

Scheme interpreter for rust
Documentation
use super::*;

pub(super) fn install(env: &mut Environment) {
    define_builtin(env, "procedure?", is_procedure);
    define_builtin(env, "apply", apply);
}

fn is_procedure(_: &Engine, args: &[Value]) -> Result<Value, SchemeError> {
    expect_arity("procedure?", args, 1)?;
    Ok(Value::Boolean(matches!(args[0], Value::Procedure(_))))
}

fn apply(engine: &Engine, args: &[Value]) -> Result<Value, SchemeError> {
    if args.len() < 2 {
        return Err(SchemeError::arity(
            "'apply' expects a procedure, optional arguments, and a final list",
        ));
    }

    let procedure = args[0].clone();
    let (last, leading) = args[1..].split_last().ok_or_else(|| {
        SchemeError::arity("'apply' expects a procedure and a final argument list")
    })?;

    let mut applied_args = leading.to_vec();
    applied_args.extend(expect_list("apply", last)?);
    engine.apply(procedure, engine.current_env(), applied_args)
}