tulisp 0.29.0

An embeddable lisp interpreter.
Documentation
use crate::{
    Error, ErrorKind, TulispContext, TulispObject,
    bytecode::{Instruction, compiler::compiler::compile_expr, instruction::Cxr},
};

pub(super) fn compile_fn_cxr(
    ctx: &mut TulispContext,
    name: &TulispObject,
    args: &TulispObject,
) -> Result<Vec<Instruction>, Error> {
    let mut result =
        ctx.compile_1_arg_call(name, args, false, |ctx, arg1, _| compile_expr(ctx, arg1))?;
    let compiler = ctx.compiler.as_mut().unwrap();
    if compiler.keep_result {
        let name = name.to_string();
        match name.as_str() {
            "car" => result.push(Instruction::Cxr(Cxr::Car)),
            "cdr" => result.push(Instruction::Cxr(Cxr::Cdr)),
            "caar" => result.push(Instruction::Cxr(Cxr::Caar)),
            "cadr" => result.push(Instruction::Cxr(Cxr::Cadr)),
            "cdar" => result.push(Instruction::Cxr(Cxr::Cdar)),
            "cddr" => result.push(Instruction::Cxr(Cxr::Cddr)),
            "caaar" => result.push(Instruction::Cxr(Cxr::Caaar)),
            "caadr" => result.push(Instruction::Cxr(Cxr::Caadr)),
            "cadar" => result.push(Instruction::Cxr(Cxr::Cadar)),
            "caddr" => result.push(Instruction::Cxr(Cxr::Caddr)),
            "cdaar" => result.push(Instruction::Cxr(Cxr::Cdaar)),
            "cdadr" => result.push(Instruction::Cxr(Cxr::Cdadr)),
            "cddar" => result.push(Instruction::Cxr(Cxr::Cddar)),
            "cdddr" => result.push(Instruction::Cxr(Cxr::Cdddr)),
            "caaaar" => result.push(Instruction::Cxr(Cxr::Caaaar)),
            "caaadr" => result.push(Instruction::Cxr(Cxr::Caaadr)),
            "caadar" => result.push(Instruction::Cxr(Cxr::Caadar)),
            "caaddr" => result.push(Instruction::Cxr(Cxr::Caaddr)),
            "cadaar" => result.push(Instruction::Cxr(Cxr::Cadaar)),
            "cadadr" => result.push(Instruction::Cxr(Cxr::Cadadr)),
            "caddar" => result.push(Instruction::Cxr(Cxr::Caddar)),
            "cadddr" => result.push(Instruction::Cxr(Cxr::Cadddr)),
            "cdaaar" => result.push(Instruction::Cxr(Cxr::Cdaaar)),
            "cdaadr" => result.push(Instruction::Cxr(Cxr::Cdaadr)),
            "cdadar" => result.push(Instruction::Cxr(Cxr::Cdadar)),
            "cdaddr" => result.push(Instruction::Cxr(Cxr::Cdaddr)),
            "cddaar" => result.push(Instruction::Cxr(Cxr::Cddaar)),
            "cddadr" => result.push(Instruction::Cxr(Cxr::Cddadr)),
            "cdddar" => result.push(Instruction::Cxr(Cxr::Cdddar)),
            "cddddr" => result.push(Instruction::Cxr(Cxr::Cddddr)),
            _ => return Err(Error::new(ErrorKind::Undefined, "unknown cxr".to_string())),
        }
    }
    Ok(result)
}