From 9abe404925072b4942cdfc1b7c4297186fe9d419 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20R=C3=B6ger?= Date: Wed, 6 Nov 2024 11:24:02 +0100 Subject: [PATCH] fix(eval): early eval of arguments to functions --- src/lisp/eval.rs | 2 +- src/lisp/prelude.rs | 7 ++++--- src/main.rs | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/lisp/eval.rs b/src/lisp/eval.rs index 7b28ef9..0dae52c 100644 --- a/src/lisp/eval.rs +++ b/src/lisp/eval.rs @@ -85,7 +85,7 @@ fn dispatch_anonymous_function( } for (arg, symbol) in args.iter_mut().zip(argument_symbols.iter()) { - overlay.set(symbol.to_owned(), arg.to_owned()); + overlay.set(symbol.to_owned(), eval(env, arg.to_owned())?); } eval(&env.overlay(overlay), body) diff --git a/src/lisp/prelude.rs b/src/lisp/prelude.rs index 6e4967d..a3e9c3f 100644 --- a/src/lisp/prelude.rs +++ b/src/lisp/prelude.rs @@ -161,10 +161,11 @@ pub fn prelude_gt(env: &Environment, expr: Expression) -> Result Result { let [s, e] = expr.try_into()?; - match s { + match eval(env, s)? { Expression::Symbol(s) => { - env.shared_set(s, e); - Ok(Expression::Nil) + let e = eval(env, e)?; + env.shared_set(s, e.clone()); + Ok(e) } x => Err(EvalError::NotASymbol(x)), } diff --git a/src/main.rs b/src/main.rs index 677a98f..26ac13f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,8 +6,8 @@ use crate::lisp::{eval, Environment}; fn main() { let program1 = "((lambda (x y) (+ (if (< x 10) (* x 11) x) y)) 2 20)"; - let program2 = "(set myvar \"hello world!\")"; - let program3 = "(print myvar)"; + let program2 = "(set 'myvar \"hello world!\")"; + let program3 = "(print myvar) (print 'myvar)"; let environment = Environment::default();