fix let, let*
This commit is contained in:
parent
5ee33f8cf6
commit
b66b4f6668
|
|
@ -615,48 +615,45 @@ p_if:
|
|||
;; (Env, (var val), Env) -> Env
|
||||
;; $rdi = acc-env, $rsi = (var val), $rdx = genv
|
||||
p_let_inner:
|
||||
sub rsp, 24
|
||||
sub rsp, 16
|
||||
mov qword [rsp], rdi ; acc-env
|
||||
mov qword [rsp + 8], rsi ; (var val)
|
||||
mov qword [rsp + 16], rdx ; genv
|
||||
mov rdi, rsi
|
||||
call get_cdr
|
||||
mov rdi, rax
|
||||
mov rdi, rax ; (val . nil)
|
||||
call get_car
|
||||
mov rdi, rax
|
||||
mov rsi, qword [rsp + 16] ; genv
|
||||
mov rdi, rax ; val
|
||||
mov rsi, rdx ; genv
|
||||
call eval
|
||||
mov rsi, rax ; val
|
||||
mov rdi, qword [rsp + 8] ; (var val)
|
||||
call get_car
|
||||
mov rdi, rax ; var
|
||||
call cons
|
||||
mov rdi, rax
|
||||
mov rsi, qword [rsp] ; acc-env
|
||||
call cons
|
||||
add rsp, 24
|
||||
mov rdx, qword [rsp] ; acc-env
|
||||
call prepend ; ((var . val) . acc-env)
|
||||
add rsp, 16
|
||||
ret
|
||||
|
||||
;; (Env, (var val), Env) -> Env
|
||||
;; $rdi = acc-env, $rsi = (var val), $rdx = genv
|
||||
p_let_star_inner:
|
||||
sub rsp, 24
|
||||
sub rsp, 16
|
||||
mov qword [rsp], rdi ; acc-env
|
||||
mov qword [rsp + 8], rsi ; (var val)
|
||||
mov rdi, rsi
|
||||
call get_cdr
|
||||
mov rdi, rax
|
||||
call get_car
|
||||
mov rdi, rax
|
||||
mov rsi, qword [rsp] ; genv
|
||||
mov rsi, qword [rsp] ; acc-env
|
||||
call eval
|
||||
mov rsi, rax ; val
|
||||
mov rdi, qword [rsp + 8] ; (var val)
|
||||
call get_car
|
||||
mov rdi, rax ; var
|
||||
call cons
|
||||
mov rdi, rax
|
||||
mov rsi, qword [rsp] ; acc-env
|
||||
call cons
|
||||
add rsp, 24
|
||||
mov rdx, qword [rsp] ; acc-env
|
||||
call prepend ; ((var . val) . acc-env)
|
||||
add rsp, 16
|
||||
ret
|
||||
|
||||
|
||||
|
|
@ -1756,8 +1753,6 @@ prepend:
|
|||
call cons
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;; PRIMITIVES
|
||||
|
||||
;; returns 1 if the object in $rdi is nil, 0 otherwise
|
||||
|
|
|
|||
|
|
@ -154,7 +154,7 @@ fn test_parse_list() {
|
|||
let env = unsafe { *ENV_INIT };
|
||||
println!("env: {:?}\n", env);
|
||||
|
||||
let input = b"((eval (define succ (lambda (x) (+ x 1)))) 4)";
|
||||
let input = b"(let ((x 10) (y 20)) (+ x y))";
|
||||
let mut src = Source::from(&input[..]);
|
||||
let sexp = unsafe { parse_next_token(&raw mut src) };
|
||||
println!("> {:?}", sexp);
|
||||
|
|
|
|||
Loading…
Reference in a new issue