scheme-r6rs

    R6RS Scheme interpreter in MoonBit

    Download zip
    Author
    Version
    0.1.1
    License
    MIT
    Last updated
    last month
    Downloads
    42

    Dependencies

    #Scheme R6RS in MoonBit

    This module implements a Scheme R6RS interpreter in MoonBit. It includes a lexer, parser, macro expander, evaluator, and runtime helpers.

    #Layout

    • core: runtime types plus Unicode helpers
    • parser: datum parsing and number parsing
      • internal/lexer: reader and token utilities
    • eval: macro expansion and evaluation
    • internal/runtime: environment, records, ports, and value helpers

    #Usage

    ///|
    let program = "(+ 1 2)"

    ///|
    let value = @bobzhang/scheme-r6rs.eval_program(program)

    ///|
    let text = @bobzhang/scheme-r6rs.value_to_string(value)

    #CLI (native)

    The native CLI lives in cmd/ (a separate MoonBit module using moonbitlang/async). moonbitlang/async currently supports native backends only (Linux/macOS).

    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 -- -

    #Tests

    ///|
    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")
    }
    }

    #Development

    Use moon check to type check, moon test to run the spec tests, and moon fmt to format the code.

    eval_program

    fn eval_program(src : String) ->
    Value
    raise

    Evaluate a full Scheme program and return the final value.

    Example

    test "facade eval" {
    let value = eval_program("(+ 1 2)")
    inspect(value_to_string(value), content="3")
    }

    eval_program_all

    fn eval_program_all(src : String) -> Array[
    Value
    ] raise

    Evaluate a full Scheme program and return all top-level results.

    Example

    test "facade eval all" {
    let values = eval_program_all("(define x 1) (+ x 2)")
    inspect(values.length(), content="2")
    }

    parse_number_token

    fn parse_number_token(tok : String, radix? : Int) ->
    Datum
    ?

    Parse a numeric token using default radix and exactness rules.

    Example

    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")
    }
    }

    parse_program

    fn parse_program(src : String, fold_case? : Bool) -> Array[
    Datum
    ] raise
    ParseError

    Parse all top-level datums from a source string.

    Example

    test "facade parse program" {
    let forms = parse_program("#\\a")
    match forms {
    [Char('a'), ..] => ()
    _ => fail("expected char datum")
    }
    }

    Example

    test "facade parse program fold case" {
    let forms = parse_program("ABC", fold_case=true)
    match forms {
    [Symbol("abc"), ..] => ()
    _ => fail("expected folded symbol")
    }
    }

    register_include_source

    fn register_include_source(path : String, content : String) -> Unit

    Register an in-memory source for (include ...) by path.

    Example

    test "facade include" {
    register_include_source("mem.scm", "(+ 1 2)")
    let value = eval_program("(include \"mem.scm\")")
    inspect(value_to_string(value), content="3")
    }

    value_to_string

    fn value_to_string(value :
    Value
    ) -> String

    Render a runtime value using Scheme write/display rules.

    Example

    test "facade value to string" {
    let value = eval_program("(+ 1 2)")
    inspect(value_to_string(value), content="3")
    }

    Source Files

    Powered by MoonBit

    Site sourceReport issuePackagesBuild queueSkillsStatistics

    © 2026 mooncakes.io