# _λ_ Marwood   [![License Badge]][License] [![Test Badge]][Test] [![Deploy Badge]][Deploy] [License Badge]: https://img.shields.io/badge/license-MIT%2FApache--2.0-blue?style=flat&logo=appveyor [License]: LICENSE-MIT [Test Badge]: https://github.com/strtok/marwood/actions/workflows/test.yml/badge.svg [Test]: https://github.com/strtok/marwood/actions/workflows/test.yml [Deploy Badge]: https://github.com/strtok/marwood/actions/workflows/deploy.yml/badge.svg [Deploy]: https://github.com/strtok/marwood/actions/workflows/deploy.yml Marwood is an embeddable [Scheme R7RS](https://small.r7rs.org) implementation, featuring: * a scheme R7RS compiler & 64 bit runtime * a terminal based repl using [rustyline](https://github.com/kkawakam/rustyline) * a WebAssembly repl at [repl.marwood.io](https://repl.marwood.io). And these scheme language features: * most R7RS language and library features * Tail call optimization * First class continuations (call/cc) * Support for scheme's numerical tower, including rationals * Partial support for syntax-rules # Example The adder example creates a procedure called `make-adder`, which given an argument x returns a procedure that adds its own argument y to x. This example may be executed with `cargo run --example adder`. Here's the scheme that will execute in the VM given the rust example: ```scheme (define make-adder (lambda (x) (lambda (y) (+ x y)))) (define add-1000 (make-adder 1000)) (add-1000 0) (add-1000 1) (add-1000 2) (add-1000 3) (add-1000 4) ``` And the rust code to execute the scheme above in marwood: ```rust let mut vm = Vm::new(); vm.eval_text("(define make-adder (lambda (x) (lambda (y) (+ x y))))") .unwrap(); vm.eval_text("(define add-1000 (make-adder 1000))") .unwrap(); for it in 0..5 { match vm.eval(&list!["add-1000", it]) { Ok(result) => { println!("{} => {}", it, result); assert_eq!(result, cell![1000 + it]) } Err(e) => error!("error: {}", e), } } ``` # License Licensed under either of Apache License, Version 2.0 or MIT license.