fix typeof aliasing the cons method
This commit is contained in:
parent
02551fe706
commit
e287ace328
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:?}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
)
|
||||
|
|
|
|||
Loading…
Reference in a new issue