From 55be4528d2dc59acbc51fc672d9846b960972658 Mon Sep 17 00:00:00 2001 From: Ben Bridle Date: Mon, 20 Oct 2025 11:53:45 +1300 Subject: Allow one-element lists to be used as integers in expressions If an operator requires an integer value but instead receives a list value that contains a single integer, that integer will be extracted and used instead. --- src/types/expression_stack.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/types/expression_stack.rs b/src/types/expression_stack.rs index 1036842..fdf6ed8 100644 --- a/src/types/expression_stack.rs +++ b/src/types/expression_stack.rs @@ -18,7 +18,10 @@ impl ExpressionStack { 1 => { match self.stack.pop().unwrap() { IntermediateValue::Integer(value) => Ok(*value), - IntermediateValue::List(_) => Err(ExpressionError::InvalidReturnType("a list")), + IntermediateValue::List(mut list) => match list.len() { + 1 => Ok(list.pop().unwrap().value), + _ => Err(ExpressionError::InvalidReturnType("a list")), + } IntermediateValue::Block(_) => Err(ExpressionError::InvalidReturnType("a block")), } } @@ -95,7 +98,10 @@ fn null_span() -> SourceSpan { fn to_isize(value: IntermediateValue) -> Result { let received = match value { IntermediateValue::Integer(integer) => return Ok(integer.value), - IntermediateValue::List(_) => "a list", + IntermediateValue::List(mut list) => match list.len() { + 1 => return Ok(list.pop().unwrap().value), + _ => "a list" + } IntermediateValue::Block(_) => "a block", }; Err(ExpressionError::InvalidArgumentType("an integer", received)) -- cgit v1.2.3-70-g09d2