From da9aa1e29d9d3bf66af46f88c2c6ae5250a394ca Mon Sep 17 00:00:00 2001 From: greg Date: Wed, 7 Mar 2018 21:46:21 -0800 Subject: [PATCH] Index evaluation --- src/schala_lang/eval.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/schala_lang/eval.rs b/src/schala_lang/eval.rs index c90391d..94c521b 100644 --- a/src/schala_lang/eval.rs +++ b/src/schala_lang/eval.rs @@ -175,6 +175,26 @@ impl<'a> State<'a> { } self.eval_application(*f, evaled_arguments) }, + Index { box indexee, mut indexers } => { + let evaled = self.eval_expr(indexee)?; + match evaled { + Tuple(mut exprs) => { + let len = indexers.len(); + if len == 1 { + indexers.truncate(1); + let idx = indexers.pop().unwrap(); + match self.eval_expr(idx)? { + UnsignedInt(n) if (n as usize) < exprs.len() => Ok(exprs.drain(n as usize..).next().unwrap()), + UnsignedInt(n) => Err(format!("Index {} out of range", n)), + other => Err(format!("{:?} is not an unsigned integer", other)), + } + } else { + Err(format!("Tuple index must be one integer")) + } + }, + _ => Err(format!("Bad index expression")) + } + }, x => Err(format!("Unimplemented thing {:?}", x)), } }