From b66b4f66686d18fa2defe9cbd0b4168a180deb29 Mon Sep 17 00:00:00 2001 From: janis Date: Fri, 12 Jun 2026 00:22:18 +0200 Subject: [PATCH] fix let, let* --- stages/lisp0/lisp.asm | 33 ++++++++++++++------------------- stages/lisp0/lisp.rs | 2 +- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/stages/lisp0/lisp.asm b/stages/lisp0/lisp.asm index 453953d..636dda5 100644 --- a/stages/lisp0/lisp.asm +++ b/stages/lisp0/lisp.asm @@ -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 diff --git a/stages/lisp0/lisp.rs b/stages/lisp0/lisp.rs index a5aa396..609e40b 100644 --- a/stages/lisp0/lisp.rs +++ b/stages/lisp0/lisp.rs @@ -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);