59 releases
new 0.1.58 | Dec 18, 2024 |
---|---|
0.1.51 | Nov 27, 2024 |
0.1.21 | Jul 16, 2024 |
#2279 in Procedural macros
1,014 downloads per month
19KB
102 lines
Stak Scheme
The miniature, embeddable R7RS Scheme implementation in Rust
The full documentation is here.
Install
Library
To install Stak Scheme as a library in your Rust project, run:
cargo add stak
Command line tools
To install the Scheme interpreter and alike as command line tools, run:
# Install the Scheme interpreter.
cargo install stak
# Install the minimal Scheme interpreter (6 times smaller!)
cargo install mstak
# Install the Scheme-to-bytecode compiler and bytecode interpreter.
cargo install stak-compile
cargo install stak-interpret
Examples
Running a Scheme script
First, prepare a Scheme script at src/hello.scm
.
(import (scheme base))
(write-string "Hello, world!\n")
Then, add a build script at build.rs
to build the Scheme source file into bytecodes.
use stak_build::{build_r7rs, BuildError};
fn main() -> Result<(), BuildError> {
build_r7rs()
}
Now, you can include the Scheme script into a program in Rust using the stak::include_bytecode
macro.
use core::error::Error;
use stak::{
device::StdioDevice,
file::VoidFileSystem,
include_bytecode,
process_context::VoidProcessContext,
r7rs::{SmallError, SmallPrimitiveSet},
time::VoidClock,
vm::Vm,
};
const HEAP_SIZE: usize = 1 << 16;
const BYTECODES: &[u8] = include_bytecode!("hello.scm");
fn main() -> Result<(), Box<dyn Error>> {
run(BYTECODES)?;
Ok(())
}
fn run(bytecodes: &[u8]) -> Result<(), SmallError> {
let mut heap = [Default::default(); HEAP_SIZE];
let mut vm = Vm::new(
&mut heap,
SmallPrimitiveSet::new(
StdioDevice::new(),
VoidFileSystem::new(),
VoidProcessContext::new(),
VoidClock::new(),
),
)?;
vm.initialize(bytecodes.iter().copied())?;
vm.run()
}
License
Dependencies
~1.3–1.8MB
~40K SLoC