fix typeof aliasing the cons method

This commit is contained in:
janis 2026-07-05 01:58:04 +02:00
parent 02551fe706
commit e287ace328
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8
3 changed files with 35 additions and 19 deletions

View file

@ -87,17 +87,21 @@ section .rodata
SETQ_STR_LEN equ $ - SETQ_STR SETQ_STR_LEN equ $ - SETQ_STR
TYPEOF_STR db "typeof" TYPEOF_STR db "typeof"
TYPEOF_STR_LEN equ $ - TYPEOF_STR 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 BYTE_STR_LEN equ $ - BYTE_STR
NUM_STR db "number" NUM_STR db "NUMBER"
NUM_STR_LEN equ $ - NUM_STR 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 PRIM_STR_LEN equ $ - PRIM_STR
CLOSURE_STR db "closure" CLOSURE_STR db "CLOSURE"
CLOSURE_STR_LEN equ $ - CLOSURE_STR CLOSURE_STR_LEN equ $ - CLOSURE_STR
ATOM_STR db "atom" ATOM_STR db "ATOM"
ATOM_STR_LEN equ $ - ATOM_STR ATOM_STR_LEN equ $ - ATOM_STR
ARRAY_STR db "array" ARRAY_STR db "ARRAY"
ARRAY_STR_LEN equ $ - ARRAY_STR ARRAY_STR_LEN equ $ - ARRAY_STR
section .data section .data
@ -115,8 +119,8 @@ ATOM_T:
dq 1 dq 1
ATOM_NIL: ATOM_NIL:
dq 1 dq 1
dq NILQ_STR dq NIL_TY_STR
dq NILQ_STR_LEN - 1 dq NIL_TY_STR_LEN
ATOM_BYTE: ATOM_BYTE:
dq 1 dq 1
dq BYTE_STR dq BYTE_STR
@ -131,8 +135,8 @@ ATOM_PRIM:
dq PRIM_STR_LEN dq PRIM_STR_LEN
ATOM_CONS: ATOM_CONS:
dq 1 dq 1
dq CONS_STR dq CONS_TY_STR
dq CONS_STR_LEN dq CONS_TY_STR_LEN
ATOM_CLOSURE: ATOM_CLOSURE:
dq 1 dq 1
dq CLOSURE_STR dq CLOSURE_STR
@ -3153,12 +3157,11 @@ p_cons:
mov qword [rsp], rax ; evaled list mov qword [rsp], rax ; evaled list
mov rdi, rax mov rdi, rax
call car_cdar_or_panic ; (a . b) call car_cdar_or_panic ; (a . b)
mov rdi, rax ; a mov rdi, rdx ; b
mov rsi, rax ; a
call obj_inc_ref call obj_inc_ref
mov rsi, rdx ; b xchg rdi, rsi
call obj_inc_ref call obj_inc_ref
mov rdi, rax ; a'
mov rsi, rdx ; b'
call cons ; (a' . b') call cons ; (a' . b')
mov rdi, qword [rsp] ; evaled list mov rdi, qword [rsp] ; evaled list
mov qword [rsp], rax ; result mov qword [rsp], rax ; result

View file

@ -486,4 +486,17 @@ mod tests {
eprintln!("{result:?}"); 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:?}");
}
}
} }

View file

@ -4,9 +4,9 @@
(define assert (lambda (cond) (define assert (lambda (cond)
(if (nil? cond) (if (nil? cond)
(exit 1) ()))) (exit 1) ())))
(assert (= (typeof 1) 'number)) (assert (= (typeof 1) 'NUMBER))
(assert (= (typeof 'symbol) 'atom)) (assert (= (typeof 'symbol) 'ATOM))
(assert (= (typeof '()) 'nil)) (assert (= (typeof '()) 'NIL))
(assert (= (typeof '(1 2 3)) 'cons)) (assert (= (typeof '(1 2 3)) 'CONS))
(assert (= (typeof exit) 'closure)) (assert (= (typeof exit) 'CLOSURE))
) )