diff options
Diffstat (limited to 'src/lisp/prelude.rs')
-rw-r--r-- | src/lisp/prelude.rs | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/lisp/prelude.rs b/src/lisp/prelude.rs index f5ff13a..e24ade5 100644 --- a/src/lisp/prelude.rs +++ b/src/lisp/prelude.rs | |||
@@ -437,5 +437,23 @@ pub fn new_env() -> Result<Environment, LispError> { | |||
437 | } | 437 | } |
438 | }); | 438 | }); |
439 | 439 | ||
440 | primitive!(env, Arity::Exact(2), "range", |args, _| { | ||
441 | if type_match!( | ||
442 | args, | ||
443 | 0 => LispExpr::Number(LispNumber::Integer(_)), | ||
444 | 1 => LispExpr::Number(LispNumber::Integer(_))) | ||
445 | { | ||
446 | let lower = args[0].unwrap_number().unwrap_integer(); | ||
447 | let upper = args[1].unwrap_number().unwrap_integer(); | ||
448 | Ok(LispExpr::List( | ||
449 | (lower..upper) | ||
450 | .map(|i| LispExpr::Number(LispNumber::Integer(i))) | ||
451 | .collect::<Vec<_>>(), | ||
452 | )) | ||
453 | } else { | ||
454 | Err(EvalError::TypeMismatch.into()) | ||
455 | } | ||
456 | }); | ||
457 | |||
440 | Ok(env) | 458 | Ok(env) |
441 | } | 459 | } |