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
|
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
|
||||||
|
|
|
||||||
|
|
@ -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:?}");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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))
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue