fix let, let*

This commit is contained in:
janis 2026-06-12 00:22:18 +02:00
parent 5ee33f8cf6
commit b66b4f6668
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8
2 changed files with 15 additions and 20 deletions

View file

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

View file

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