A Scheme interpreter implemented in Moonbit. It will be used for teaching purposes and not too many optimizations will be added. The understandability of the code is given top priority.
Reference:
-
Three Implementation Models for Scheme Chapter 3 The Heap-Based Model
test "example in README" {
let env = Environment::base()..add_number_primitive()
let code =
#|(define (fact x)
#| (if (= x 0)
#| 1 ; base case
#| (* x (fact (- x 1))))) ; rec case
#|(fact 5)
let sexp = parse!(code)
let program = [ //
sexp[0].to_core_form!(),
sexp[1].to_core_form!(),
]
let inst = program.map(compile)
// make VM, load "(define (fact x) ...)" and env
let vm = VM::new(inst=inst[0], env~)
// run, add "fact" to env
vm.run_to_halt!()
inspect!( //
vm.env.lookup!(Symbol::of("fact")),
content="#<procedure fact>",
)
// load and run "(fact 5)"
vm.next = inst[1]
vm.run_to_halt!()
inspect!(vm.acc, content="120")
}