aboutsummaryrefslogtreecommitdiff
path: root/src/lisp/expr.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lisp/expr.rs')
-rw-r--r--src/lisp/expr.rs12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/lisp/expr.rs b/src/lisp/expr.rs
index 045991e..6f5b139 100644
--- a/src/lisp/expr.rs
+++ b/src/lisp/expr.rs
@@ -26,13 +26,17 @@ pub enum Arity {
26} 26}
27 27
28impl Arity { 28impl Arity {
29 pub fn check<T>(self, args: &[T]) -> bool { 29 pub fn check<T>(self, args: &[T]) -> Result<(), LispError> {
30 match self { 30 if !match self {
31 Arity::Exact(a) => args.len() == a, 31 Arity::Exact(a) => args.len() == a,
32 Arity::Atleast(a) => args.len() >= a, 32 Arity::Atleast(a) => args.len() >= a,
33 Arity::Atmost(a) => args.len() <= a, 33 Arity::Atmost(a) => args.len() <= a,
34 Arity::Range(low, high) => args.len() >= low && args.len() <= high, 34 Arity::Range(low, high) => args.len() >= low && args.len() <= high,
35 Arity::None => true, 35 Arity::None => true,
36 } {
37 Err(self.to_error())
38 } else {
39 Ok(())
36 } 40 }
37 } 41 }
38 pub fn to_error(self) -> LispError { 42 pub fn to_error(self) -> LispError {
@@ -49,9 +53,7 @@ pub struct PrimitiveFunc {
49 53
50impl PrimitiveFunc { 54impl PrimitiveFunc {
51 pub fn call(&self, args: &[LispExpr], app: &mut AppState) -> Result<LispExpr, LispError> { 55 pub fn call(&self, args: &[LispExpr], app: &mut AppState) -> Result<LispExpr, LispError> {
52 if !self.arity.check(args) { 56 self.arity.check(args)?;
53 return Err(EvalError::ArgumentCount(self.arity).into());
54 }
55 (self.closure)(args, app) 57 (self.closure)(args, app)
56 } 58 }
57} 59}