R6RS Scheme interpreter in MoonBit
Dependencies
///|
let program = "(+ 1 2)"
///|
let value = @bobzhang/scheme-r6rs.eval_program(program)
///|
let text = @bobzhang/scheme-r6rs.value_to_string(value)moon -C cmd run main -- --help
moon -C cmd run main -- --eval "(+ 1 2)"
moon -C cmd run main -- program.scm
printf '(+ 10 32)\n' | moon -C cmd run main -- -///|
test "eval program" {
let value = eval_program("(+ 1 2)")
inspect(value_to_string(value), content="3")
let list_value = eval_program("(list 1 2 3)")
inspect(value_to_string(list_value), content="(1 2 3)")
let forms = parse_program("(+ 1 2)")
inspect(forms.length(), content="1")
let values = eval_program_all("(define x 1) (+ x 2)")
inspect(values.length(), content="2")
register_include_source("mem.scm", "(+ 2 3)")
let included = eval_program("(include \"mem.scm\")")
inspect(value_to_string(included), content="5")
match parse_number_token("10") {
Some(Int(10)) => ()
_ => fail("expected int")
}
match parse_number_token("ff", radix=16) {
Some(Int(255)) => ()
_ => fail("expected 255")
}
try eval_program("(car 1)") catch {
_ => ()
} noraise {
_ => fail("expected car on a non-pair to raise")
}
}test "facade eval" {
let value = eval_program("(+ 1 2)")
inspect(value_to_string(value), content="3")
}test "facade eval all" {
let values = eval_program_all("(define x 1) (+ x 2)")
inspect(values.length(), content="2")
}test "facade parse number token" {
match parse_number_token("10") {
Some(Int(10)) => ()
_ => fail("expected integer")
}
match parse_number_token("ff", radix=16) {
Some(Int(255)) => ()
_ => fail("expected 255")
}
}test "facade parse program" {
let forms = parse_program("#\\a")
match forms {
[Char('a'), ..] => ()
_ => fail("expected char datum")
}
}test "facade parse program fold case" {
let forms = parse_program("ABC", fold_case=true)
match forms {
[Symbol("abc"), ..] => ()
_ => fail("expected folded symbol")
}
}fn register_include_source(path : String, content : String) -> Unittest "facade include" {
register_include_source("mem.scm", "(+ 1 2)")
let value = eval_program("(include \"mem.scm\")")
inspect(value_to_string(value), content="3")
}