mod error;
pub use self::error::CompileError;
use stak_device::ReadWriteDevice;
use stak_primitive::SmallPrimitiveSet;
use stak_vm::Vm;
use std::io::{empty, Read, Write};
const DEFAULT_HEAP_SIZE: usize = 1 << 20;
const PRELUDE_SOURCE: &str = include_str!("prelude.scm");
const COMPILER_BYTECODES: &[u8] = include_bytes!(std::env!("STAK_BYTECODE_FILE"));
pub fn compile_r7rs(source: impl Read, target: impl Write) -> Result<(), CompileError> {
compile_bare(PRELUDE_SOURCE.as_bytes().chain(source), target)
}
pub fn compile_bare(source: impl Read, target: impl Write) -> Result<(), CompileError> {
let mut heap = vec![Default::default(); DEFAULT_HEAP_SIZE];
let device = ReadWriteDevice::new(source, target, empty());
let mut vm = Vm::new(&mut heap, SmallPrimitiveSet::new(device))?;
vm.initialize(COMPILER_BYTECODES.iter().copied())?;
vm.run()?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
mod r7rs {
use super::*;
#[test]
fn compile_nothing() {
compile_r7rs(b"".as_slice(), &mut vec![]).unwrap();
}
#[test]
fn compile_define() {
compile_r7rs(b"(define x 42)".as_slice(), &mut vec![]).unwrap();
}
}
mod bare {
use super::*;
#[test]
fn compile_nothing() {
compile_bare(b"".as_slice(), &mut vec![]).unwrap();
}
#[test]
fn compile_define() {
compile_bare(b"($$define x 42)".as_slice(), &mut vec![]).unwrap();
}
}
}