scala 0.1.1

A experimental Scala interpreter written in Rust: lexer, parser, type inference, and tree-walking evaluation with a REPL.
Documentation
use crate::env::Environment;
use crate::value::Value;

pub fn register_stdlib(env: &mut Environment) {
    env.define("println", Value::BuiltinFunction { name: "__println__".into(), arity: 1 }, false);
    env.define("print", Value::BuiltinFunction { name: "__print__".into(), arity: 1 }, false);
    env.define("assert", Value::BuiltinFunction { name: "__assert__".into(), arity: 1 }, false);
    env.define("require", Value::BuiltinFunction { name: "__require__".into(), arity: 1 }, false);
    env.define("identity", Value::BuiltinFunction { name: "__identity__".into(), arity: 1 }, false);

    env.define("List", Value::BuiltinFunction { name: "__List_apply__".into(), arity: 0 }, false);
    env.define("Map", Value::BuiltinFunction { name: "__Map_apply__".into(), arity: 0 }, false);
    env.define("Some", Value::BuiltinFunction { name: "__Some__".into(), arity: 1 }, false);
    env.define("None", Value::String("None".into()), false);

    let math_obj = Value::Object {
        class_name: "math".into(),
        fields: {
            let mut f = std::collections::HashMap::new();
            f.insert("Pi".into(), Value::Double(std::f64::consts::PI));
            f.insert("E".into(), Value::Double(std::f64::consts::E));
            f
        },
        methods: {
            let mut m = std::collections::HashMap::new();
            m.insert("abs".into(), Value::BuiltinFunction { name: "__abs__".into(), arity: 1 });
            m.insert("max".into(), Value::BuiltinFunction { name: "__max__".into(), arity: 2 });
            m.insert("min".into(), Value::BuiltinFunction { name: "__min__".into(), arity: 2 });
            m.insert("pow".into(), Value::BuiltinFunction { name: "__pow__".into(), arity: 2 });
            m.insert("sqrt".into(), Value::BuiltinFunction { name: "__sqrt__".into(), arity: 1 });
            m
        },
    };
    env.define("math", math_obj, false);

    env.define("Range", Value::Object {
        class_name: "Range$".into(),
        fields: std::collections::HashMap::new(),
        methods: {
            let mut m = std::collections::HashMap::new();
            m.insert("apply".into(), Value::BuiltinFunction { name: "__range_to__".into(), arity: 2 });
            m
        },
    }, false);

    env.define("toInt", Value::BuiltinFunction { name: "__identity__".into(), arity: 1 }, false);
}