diff options
Diffstat (limited to 'src/lisp')
-rw-r--r-- | src/lisp/eval.rs | 14 | ||||
-rw-r--r-- | src/lisp/expr.rs | 2 | ||||
-rw-r--r-- | src/lisp/prelude.rs | 3 | ||||
-rw-r--r-- | src/lisp/test.lisp | 4 |
4 files changed, 12 insertions, 11 deletions
diff --git a/src/lisp/eval.rs b/src/lisp/eval.rs index b404662..75cb5c9 100644 --- a/src/lisp/eval.rs +++ b/src/lisp/eval.rs | |||
@@ -71,11 +71,7 @@ where | |||
71 | let nested_env: Environment = | 71 | let nested_env: Environment = |
72 | f.params.clone().into_iter().zip(args).collect(); | 72 | f.params.clone().into_iter().zip(args).collect(); |
73 | self.app.lisp_env.push(nested_env); | 73 | self.app.lisp_env.push(nested_env); |
74 | let result = if f.body.is_empty() { | 74 | let result = self.eval(&f.body); |
75 | Ok(LispExpr::Unit) | ||
76 | } else { | ||
77 | self.eval(&LispExpr::List(f.body.clone())) | ||
78 | }; | ||
79 | self.app.lisp_env.pop(); | 75 | self.app.lisp_env.pop(); |
80 | result | 76 | result |
81 | } | 77 | } |
@@ -111,7 +107,7 @@ where | |||
111 | } | 107 | } |
112 | Ok(LispExpr::Unit) | 108 | Ok(LispExpr::Unit) |
113 | } | 109 | } |
114 | [LispExpr::List(shorthand), LispExpr::List(body)] => { | 110 | [LispExpr::List(shorthand), body] => { |
115 | // (define (func arg) <body>) shorthand | 111 | // (define (func arg) <body>) shorthand |
116 | 112 | ||
117 | let id = shorthand[0].unwrap_ident(); | 113 | let id = shorthand[0].unwrap_ident(); |
@@ -126,7 +122,7 @@ where | |||
126 | .collect::<Result<Vec<Ident>, LispError>>()?; | 122 | .collect::<Result<Vec<Ident>, LispError>>()?; |
127 | let value = LispExpr::Function(LispFunction { | 123 | let value = LispExpr::Function(LispFunction { |
128 | params, | 124 | params, |
129 | body: body.to_vec(), | 125 | body: Box::new(body.clone()), |
130 | }); | 126 | }); |
131 | 127 | ||
132 | let local_env = &mut self.app.lisp_env.last_mut(); | 128 | let local_env = &mut self.app.lisp_env.last_mut(); |
@@ -327,10 +323,10 @@ pub fn create_lambda(cdr: &[LispExpr]) -> Result<LispExpr, LispError> { | |||
327 | return Err(arity.to_error()); | 323 | return Err(arity.to_error()); |
328 | } | 324 | } |
329 | match cdr { | 325 | match cdr { |
330 | [LispExpr::List(params), LispExpr::List(body)] if type_match!(params, (..) => LispExpr::Ident(_)) => { | 326 | [LispExpr::List(params), body] if type_match!(params, (..) => LispExpr::Ident(_)) => { |
331 | Ok(LispExpr::Function(LispFunction { | 327 | Ok(LispExpr::Function(LispFunction { |
332 | params: params.iter().map(|p| p.unwrap_ident()).collect::<Vec<_>>(), | 328 | params: params.iter().map(|p| p.unwrap_ident()).collect::<Vec<_>>(), |
333 | body: body.clone(), | 329 | body: Box::new(body.clone()), |
334 | })) | 330 | })) |
335 | } | 331 | } |
336 | _ => { | 332 | _ => { |
diff --git a/src/lisp/expr.rs b/src/lisp/expr.rs index d086ecf..045991e 100644 --- a/src/lisp/expr.rs +++ b/src/lisp/expr.rs | |||
@@ -62,7 +62,7 @@ pub type BoolLit = bool; | |||
62 | #[derive(Clone)] | 62 | #[derive(Clone)] |
63 | pub struct LispFunction { | 63 | pub struct LispFunction { |
64 | pub params: Vec<String>, | 64 | pub params: Vec<String>, |
65 | pub body: Vec<LispExpr>, | 65 | pub body: Box<LispExpr>, |
66 | } | 66 | } |
67 | 67 | ||
68 | #[derive(Clone)] | 68 | #[derive(Clone)] |
diff --git a/src/lisp/prelude.rs b/src/lisp/prelude.rs index 1d37a32..d6e1874 100644 --- a/src/lisp/prelude.rs +++ b/src/lisp/prelude.rs | |||
@@ -489,5 +489,8 @@ pub fn new_env() -> Result<Environment, LispError> { | |||
489 | } | 489 | } |
490 | }); | 490 | }); |
491 | 491 | ||
492 | primitive!(env, Arity::Exact(1), "id", |args, _| { | ||
493 | Ok(args[0].clone()) | ||
494 | }); | ||
492 | Ok(env) | 495 | Ok(env) |
493 | } | 496 | } |
diff --git a/src/lisp/test.lisp b/src/lisp/test.lisp index 53b0f59..a167f28 100644 --- a/src/lisp/test.lisp +++ b/src/lisp/test.lisp | |||
@@ -14,4 +14,6 @@ | |||
14 | (for (i '(1 2 3)) (for (j '(1 2 3)) (+ i j))) | 14 | (for (i '(1 2 3)) (for (j '(1 2 3)) (+ i j))) |
15 | (list '(2 3 4) '(3 4 5) '(4 5 6))) | 15 | (list '(2 3 4) '(3 4 5) '(4 5 6))) |
16 | 16 | ||
17 | 17 | (assert-eq | |
18 | ((lambda (x) x) 2) | ||
19 | 2) | ||