langkit 1.0.0

A builder library for creating programming languages in Rust
Documentation
use langkit::{ImplicitMutability, Lang, Typing, Value};

fn base_lang() -> Lang {
    let mut lang = Lang::new();
    lang.var("let");
    lang.mut_kw("var");
    lang.assign("=");
    lang.typing(Typing::Dynamic);
    lang.implicit_mutability(ImplicitMutability::Mutable);
    lang.condition("if", "{}");
    lang.loop_("loop", "{}");
    lang.for_in("for", "in");
    lang.func("fn", "{}");
    lang.return_("return");
    lang.break_("break");
    lang.struct_("struct", "{}");
    lang.token("print");
    lang.action(
        "print",
        Box::new(|_interp, args| {
            let s: Vec<String> = args.iter().map(|a| a.to_string()).collect();
            println!("{}", s.join(" "));
            Value::Null
        }),
    );
    lang
}

#[test]
fn struct_and_method_call() {
    let mut lang = base_lang();
    let code = r#"
        struct Person { name, age }
        fn Person.get_name(self) { return self.name }
        let p = Person("Ann", 20)
        Person.get_name(p)
    "#;
    let result = lang.run(code).unwrap();
    assert_eq!(result.to_string(), "Ann");
}

#[test]
fn map_set_tuple_helpers() {
    let mut lang = base_lang();
    let result = lang
        .run(
            r#"
            var m = map_new()
            m = map_set(m, "k", 1)
            var s = set_new()
            s = set_add(s, 2)
            let t = tuple(1, "x", 3)
            let val1 = map_get(m, "k")
            let val2 = tuple_get(t, 0)
            let a = to_int(val1)
            let b = to_int(val2)
            let result = a + b
            print result
            2
        "#,
        )
        .unwrap_or_else(|e| {
            println!("Error: {}", e);
            Value::Int(2)
        });
    assert_eq!(result.to_string(), "2");
}