diff --git a/stages/lisp0/lisp1.asm b/stages/lisp0/lisp1.asm index bde333e..62c66e5 100644 --- a/stages/lisp0/lisp1.asm +++ b/stages/lisp0/lisp1.asm @@ -87,17 +87,21 @@ section .rodata SETQ_STR_LEN equ $ - SETQ_STR TYPEOF_STR db "typeof" TYPEOF_STR_LEN equ $ - TYPEOF_STR - BYTE_STR db "byte" + NIL_TY_STR db "NIL" + NIL_TY_STR_LEN equ $ - NIL_TY_STR + BYTE_STR db "BYTE" BYTE_STR_LEN equ $ - BYTE_STR - NUM_STR db "number" + NUM_STR db "NUMBER" NUM_STR_LEN equ $ - NUM_STR - PRIM_STR db "prim" + CONS_TY_STR db "CONS" + CONS_TY_STR_LEN equ $ - CONS_TY_STR + PRIM_STR db "PRIM" PRIM_STR_LEN equ $ - PRIM_STR - CLOSURE_STR db "closure" + CLOSURE_STR db "CLOSURE" CLOSURE_STR_LEN equ $ - CLOSURE_STR - ATOM_STR db "atom" + ATOM_STR db "ATOM" ATOM_STR_LEN equ $ - ATOM_STR - ARRAY_STR db "array" + ARRAY_STR db "ARRAY" ARRAY_STR_LEN equ $ - ARRAY_STR section .data @@ -115,8 +119,8 @@ ATOM_T: dq 1 ATOM_NIL: dq 1 - dq NILQ_STR - dq NILQ_STR_LEN - 1 + dq NIL_TY_STR + dq NIL_TY_STR_LEN ATOM_BYTE: dq 1 dq BYTE_STR @@ -131,8 +135,8 @@ ATOM_PRIM: dq PRIM_STR_LEN ATOM_CONS: dq 1 - dq CONS_STR - dq CONS_STR_LEN + dq CONS_TY_STR + dq CONS_TY_STR_LEN ATOM_CLOSURE: dq 1 dq CLOSURE_STR @@ -3153,12 +3157,11 @@ p_cons: mov qword [rsp], rax ; evaled list mov rdi, rax call car_cdar_or_panic ; (a . b) - mov rdi, rax ; a + mov rdi, rdx ; b + mov rsi, rax ; a call obj_inc_ref - mov rsi, rdx ; b + xchg rdi, rsi call obj_inc_ref - mov rdi, rax ; a' - mov rsi, rdx ; b' call cons ; (a' . b') mov rdi, qword [rsp] ; evaled list mov qword [rsp], rax ; result diff --git a/stages/lisp0/test.rs b/stages/lisp0/test.rs index 00fe2dd..f844da5 100644 --- a/stages/lisp0/test.rs +++ b/stages/lisp0/test.rs @@ -486,4 +486,17 @@ mod tests { eprintln!("{result:?}"); } } + + #[test] + fn eval_eval() { + let file = ManuallyDrop::new(File::open("tests/eval.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:?}"); + } + } } diff --git a/stages/lisp0/tests/typeof.l b/stages/lisp0/tests/typeof.l index b41e2d6..f58e604 100644 --- a/stages/lisp0/tests/typeof.l +++ b/stages/lisp0/tests/typeof.l @@ -4,9 +4,9 @@ (define assert (lambda (cond) (if (nil? cond) (exit 1) ()))) - (assert (= (typeof 1) 'number)) - (assert (= (typeof 'symbol) 'atom)) - (assert (= (typeof '()) 'nil)) - (assert (= (typeof '(1 2 3)) 'cons)) - (assert (= (typeof exit) 'closure)) + (assert (= (typeof 1) 'NUMBER)) + (assert (= (typeof 'symbol) 'ATOM)) + (assert (= (typeof '()) 'NIL)) + (assert (= (typeof '(1 2 3)) 'CONS)) + (assert (= (typeof exit) 'CLOSURE)) )