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
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

View file

@ -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:?}");
}
}
}

View file

@ -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))
)