diff --git a/src/bin/demo.rs b/src/bin/demo.rs index ceb91ec..4023f19 100644 --- a/src/bin/demo.rs +++ b/src/bin/demo.rs @@ -15,6 +15,7 @@ fn main() { "(let '((a . (vec3 1 2 3)) (b . (vec3 4 5 6))) (vec3-dot (vec3-norm (vec3-add a b)) a))", "(defun do-n-times (f n) (if (= n 0) '() (cons (f) (do-n-times f (- n 1)))))", "(do-n-times (lambda () (print 'hello)) 5)", + "(progn (print 'hello) (print 'world))", ]; let environment = Environment::default(); diff --git a/src/lisp/eval.rs b/src/lisp/eval.rs index 0dae52c..5b2a2e9 100644 --- a/src/lisp/eval.rs +++ b/src/lisp/eval.rs @@ -103,7 +103,7 @@ pub fn eval(env: &Environment, expr: Expression) -> Result Err(EvalError::NotAFunction(a)), }, Expression::Quote(e) => Ok(*e), - Expression::Symbol(s) => eval(env, env.get(&s).ok_or(EvalError::SymbolNotBound(s))?), + Expression::Symbol(s) => env.get(&s).ok_or(EvalError::SymbolNotBound(s)), x => Ok(x), } } diff --git a/src/lisp/prelude.rs b/src/lisp/prelude.rs index 3e6e5a7..8176aa5 100644 --- a/src/lisp/prelude.rs +++ b/src/lisp/prelude.rs @@ -245,6 +245,16 @@ pub fn prelude_eval(env: &Environment, expr: Expression) -> Result Result { + let mut result = Expression::Nil; + + for e in CellIterator::new(expr) { + result = eval(env, e?)?; + } + + Ok(result) +} + pub fn mk_prelude(layer: &mut EnvironmentLayer) { layer.set("+".to_string(), Expression::Function(prelude_add)); layer.set("-".to_string(), Expression::Function(prelude_sub)); @@ -265,4 +275,5 @@ pub fn mk_prelude(layer: &mut EnvironmentLayer) { layer.set("car".to_string(), Expression::Function(prelude_car)); layer.set("cdr".to_string(), Expression::Function(prelude_cdr)); layer.set("eval".to_string(), Expression::Function(prelude_eval)); + layer.set("progn".to_string(), Expression::Function(prelude_progn)); }