List evaluation technically working
This commit is contained in:
parent
dd93adf5b7
commit
dbf5886aad
@ -104,6 +104,9 @@ impl Evaluable for Expression {
|
|||||||
StringLiteral(_) => false,
|
StringLiteral(_) => false,
|
||||||
Lambda(_) => false,
|
Lambda(_) => false,
|
||||||
Number(_) => false,
|
Number(_) => false,
|
||||||
|
ListLiteral(ref items) => {
|
||||||
|
items.iter().any(|x| x.is_reducible())
|
||||||
|
}
|
||||||
_ => true,
|
_ => true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -327,6 +330,20 @@ impl<'a> Evaluator<'a> {
|
|||||||
_ => (Null, None)
|
_ => (Null, None)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ListLiteral(mut exprs) => {
|
||||||
|
let mut side_effect = None;
|
||||||
|
for expr in exprs.iter_mut() {
|
||||||
|
if expr.is_reducible() {
|
||||||
|
take_mut::take(expr, |expr| {
|
||||||
|
let (a, b) = self.reduce_expr(expr);
|
||||||
|
side_effect = b;
|
||||||
|
a
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(ListLiteral(exprs), side_effect)
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,6 +74,7 @@ pub enum Expression {
|
|||||||
Block(VecDeque<Expression>),
|
Block(VecDeque<Expression>),
|
||||||
While(Box<Expression>, Vec<Expression>),
|
While(Box<Expression>, Vec<Expression>),
|
||||||
Index(Box<Expression>, Box<Expression>),
|
Index(Box<Expression>, Box<Expression>),
|
||||||
|
ListLiteral(VecDeque<Expression>),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
@ -92,6 +93,9 @@ impl fmt::Display for Expression {
|
|||||||
Lambda(Function { prototype: Prototype { ref name, ref parameters, .. }, .. }) => {
|
Lambda(Function { prototype: Prototype { ref name, ref parameters, .. }, .. }) => {
|
||||||
write!(f, "«function: {}, {} arg(s)»", name, parameters.len())
|
write!(f, "«function: {}, {} arg(s)»", name, parameters.len())
|
||||||
}
|
}
|
||||||
|
ListLiteral(ref items) => {
|
||||||
|
write!(f, "[ <a list> ]")
|
||||||
|
}
|
||||||
_ => write!(f, "UNIMPLEMENTED"),
|
_ => write!(f, "UNIMPLEMENTED"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -444,7 +448,11 @@ impl Parser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn list_expr(&mut self) -> ParseResult<Expression> {
|
fn list_expr(&mut self) -> ParseResult<Expression> {
|
||||||
unimplemented!()
|
expect!(self, LSquareBracket);
|
||||||
|
let exprlist: Vec<Expression> = self.exprlist()?;
|
||||||
|
expect!(self, RSquareBracket);
|
||||||
|
|
||||||
|
Ok(Expression::ListLiteral(VecDeque::from(exprlist)))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn number_expression(&mut self) -> ParseResult<Expression> {
|
fn number_expression(&mut self) -> ParseResult<Expression> {
|
||||||
|
Loading…
Reference in New Issue
Block a user