can evaluate simple expressions

This commit is contained in:
janis 2026-07-04 20:20:05 +02:00
parent 2b447b5517
commit 52950c255a
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8
2 changed files with 1462 additions and 61 deletions

File diff suppressed because it is too large Load diff

View file

@ -8,12 +8,17 @@ unsafe extern "C" {
fn getc() -> SourceIterResult;
fn peekc() -> SourceIterResult;
fn eval(expr: Object, env: Object) -> Object;
fn init_env() -> Object;
fn parse_next_token() -> Object;
#[link_name = "ifile"]
static mut IFILE: Source;
#[link_name = "nil"]
static NIL: ();
#[link_name = "env"]
static GENV: ();
}
use std::ptr::NonNull;
@ -59,8 +64,8 @@ impl std::fmt::Debug for Object {
}
fn fmt_prim(prim: *const (), f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let prim_ptr = unsafe { prim.cast::<usize>().read() };
write!(f, "#<prim {}>", prim_ptr)
let prim_ptr = unsafe { prim.cast::<*const ()>().read() };
write!(f, "#<prim {:?}>", prim_ptr)
}
fn fmt_cons(cons: *const (), f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
@ -110,6 +115,7 @@ impl std::fmt::Debug for Object {
atom.byte_add(8).cast::<usize>().read(),
)
};
let slice = unsafe { core::slice::from_raw_parts(ptr, len) };
let string = core::str::from_utf8(slice).unwrap_or("<invalid utf-8>");
write!(f, "'{string}")
@ -335,4 +341,28 @@ mod tests {
println!("{:?}", obj);
}
}
static mut ENV_INIT: std::cell::LazyCell<Object> =
std::cell::LazyCell::new(|| unsafe { init_env() });
#[test]
fn global_env() {
unsafe {
let env = unsafe { *ENV_INIT };
println!("{env:?}");
}
}
#[test]
fn eval_add() {
let file = ManuallyDrop::new(File::open("tests/add.l").unwrap());
unsafe {
init_source(&raw mut IFILE, file.as_raw_fd());
let expr = parse_next_token();
let env = unsafe { *ENV_INIT };
let result = eval(expr, env);
eprint!("done: ");
eprintln!("{result:?}");
}
}
}