wlambda 0.8.1

WLambda is an embeddable scripting language for Rust
Documentation
use crate::vval::{VVal, Env, StackAction};

pub fn print_value(env: &mut Env, argc: usize, raw: bool) -> Result<VVal, StackAction> {
    let mut write = env.stdio.write.borrow_mut();

    for i in 0..argc {
        if raw {
            env.arg_ref(i).unwrap().with_s_ref(|s: &str| {
                if i == (argc - 1) {
                    if i > 0 { write!(write, " ").ok(); }
                    writeln!(write, "{}", s).ok();
                } else {
                    if i > 0 { write!(write, " ").ok(); }
                    write!(write, "{}", s).ok();
                }
            });
        } else {
            let s = env.arg_ref(i).unwrap().s();

            if i == (argc - 1) {
                if i > 0 { write!(write, " ").ok(); }
                writeln!(write, "{}", s).ok();
            } else {
                if i > 0 { write!(write, " ").ok(); }
                write!(write, "{}", s).ok();
            }
        }
    }
    if argc == 0 {
        writeln!(write).ok();
    }
    if argc > 0 {
        Ok(env.arg(argc - 1))
    } else {
        Ok(VVal::None)
    }
}
pub fn debug_print_value(env: &mut Env, argc: usize, pos_str: &str) -> Result<VVal, StackAction> {
    let mut write = env.stdio.write.borrow_mut();

    write!(write, "{} DEBUG: ", pos_str).ok();

    let mut direct_print = false;
    for i in 0..argc {
        let t = env.arg_ref(i).unwrap().type_name();

        if t == "symbol" && !direct_print {
            env.arg_ref(i).unwrap().with_s_ref(|s: &str| {
                if s == "\\" {
                    direct_print = true;
                }
            });
            if direct_print {
                continue;
            }
        }

        if direct_print {
            direct_print = false;

            env.arg_ref(i).unwrap().with_s_ref(|s: &str| {
                if i == (argc - 1) {
                    if i > 1 { write!(write, " ").ok(); }
                    writeln!(write, "{}", s).ok();
                } else {
                    if i > 1 { write!(write, " ").ok(); }
                    write!(write, "{}", s).ok();
                }
            })
        } else {
            let s = env.arg_ref(i).unwrap().s();

            if i == (argc - 1) {
                if i > 0 { write!(write, " ").ok(); }
                writeln!(write, "{}({})", s, t).ok();
            } else {
                if i > 0 { write!(write, " ").ok(); }
                write!(write, "{}({})", s, t).ok();
            }
        }
    }
    if argc == 0 {
        writeln!(write).ok();
    }
    if argc > 0 {
        Ok(env.arg(argc - 1))
    } else {
        Ok(VVal::None)
    }
}