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