diff options
Diffstat (limited to 'src/eval/mod.rs')
| -rw-r--r-- | src/eval/mod.rs | 63 |
1 files changed, 33 insertions, 30 deletions
diff --git a/src/eval/mod.rs b/src/eval/mod.rs index 7c984691..540b58b9 100644 --- a/src/eval/mod.rs +++ b/src/eval/mod.rs @@ -174,8 +174,8 @@ impl Eval for Expr { fn eval(&self, ctx: &mut EvalContext) -> TypResult<Self::Output> { match self { - Self::Ident(v) => v.eval(ctx), Self::Lit(v) => v.eval(ctx), + Self::Ident(v) => v.eval(ctx), Self::Array(v) => v.eval(ctx).map(Value::Array), Self::Dict(v) => v.eval(ctx).map(Value::Dict), Self::Template(v) => v.eval(ctx).map(Value::Template), @@ -200,17 +200,17 @@ impl Eval for Lit { type Output = Value; fn eval(&self, _: &mut EvalContext) -> TypResult<Self::Output> { - Ok(match *self { - Self::None(_) => Value::None, - Self::Auto(_) => Value::Auto, - Self::Bool(_, v) => Value::Bool(v), - Self::Int(_, v) => Value::Int(v), - Self::Float(_, v) => Value::Float(v), - Self::Length(_, v, unit) => Value::Length(Length::with_unit(v, unit)), - Self::Angle(_, v, unit) => Value::Angle(Angle::with_unit(v, unit)), - Self::Percent(_, v) => Value::Relative(Relative::new(v / 100.0)), - Self::Fractional(_, v) => Value::Fractional(Fractional::new(v)), - Self::Str(_, ref v) => Value::Str(v.into()), + Ok(match self.kind() { + LitKind::None => Value::None, + LitKind::Auto => Value::Auto, + LitKind::Bool(v) => Value::Bool(v), + LitKind::Int(v) => Value::Int(v), + LitKind::Float(v) => Value::Float(v), + LitKind::Length(v, unit) => Value::Length(Length::with_unit(v, unit)), + LitKind::Angle(v, unit) => Value::Angle(Angle::with_unit(v, unit)), + LitKind::Percent(v) => Value::Relative(Relative::new(v / 100.0)), + LitKind::Fractional(v) => Value::Fractional(Fractional::new(v)), + LitKind::Str(ref v) => Value::Str(v.into()), }) } } @@ -219,9 +219,9 @@ impl Eval for Ident { type Output = Value; fn eval(&self, ctx: &mut EvalContext) -> TypResult<Self::Output> { - match ctx.scopes.get(&self.string) { + match ctx.scopes.get(self) { Some(slot) => Ok(slot.borrow().clone()), - None => bail!(self.span, "unknown variable"), + None => bail!(self.span(), "unknown variable"), } } } @@ -239,7 +239,7 @@ impl Eval for DictExpr { fn eval(&self, ctx: &mut EvalContext) -> TypResult<Self::Output> { self.items() - .map(|x| Ok((x.name().string.into(), x.expr().eval(ctx)?))) + .map(|x| Ok((x.name().take().into(), x.expr().eval(ctx)?))) .collect() } } @@ -401,7 +401,7 @@ impl Eval for CallArgs { CallArg::Named(x) => { items.push(Arg { span, - name: Some(x.name().string.into()), + name: Some(x.name().take().into()), value: Spanned::new(x.expr().eval(ctx)?, x.expr().span()), }); } @@ -457,23 +457,23 @@ impl Eval for ClosureExpr { for param in self.params() { match param { ClosureParam::Pos(name) => { - params.push((name.string, None)); + params.push((name.take(), None)); } ClosureParam::Named(named) => { - params.push((named.name().string, Some(named.expr().eval(ctx)?))); + params.push((named.name().take(), Some(named.expr().eval(ctx)?))); } ClosureParam::Sink(name) => { if sink.is_some() { - bail!(name.span, "only one argument sink is allowed"); + bail!(name.span(), "only one argument sink is allowed"); } - sink = Some(name.string); + sink = Some(name.take()); } } } // Clone the body expression so that we don't have a lifetime // dependence on the AST. - let name = self.name().map(|name| name.string); + let name = self.name().map(Ident::take); let body = self.body(); // Define the actual function. @@ -533,7 +533,7 @@ impl Eval for LetExpr { Some(expr) => expr.eval(ctx)?, None => Value::None, }; - ctx.scopes.def_mut(self.binding().string, value); + ctx.scopes.def_mut(self.binding().take(), value); Ok(Value::None) } } @@ -589,7 +589,7 @@ impl Eval for ForExpr { #[allow(unused_parens)] for ($($value),*) in $iter { - $(ctx.scopes.def_mut(&$binding.string, $value);)* + $(ctx.scopes.def_mut(&$binding, $value);)* let value = self.body().eval(ctx)?; output = ops::join(output, value) @@ -603,7 +603,10 @@ impl Eval for ForExpr { let iter = self.iter().eval(ctx)?; let pattern = self.pattern(); - match (pattern.key(), pattern.value(), iter) { + let key = pattern.key().map(Ident::take); + let value = pattern.value().take(); + + match (key, value, iter) { (None, v, Value::Str(string)) => iter!(for (v => value) in string.iter()), (None, v, Value::Array(array)) => { iter!(for (v => value) in array.into_iter()) @@ -644,10 +647,10 @@ impl Eval for ImportExpr { } Imports::Items(idents) => { for ident in idents { - if let Some(slot) = module.scope.get(&ident.string) { - ctx.scopes.def_mut(ident.string, slot.borrow().clone()); + if let Some(slot) = module.scope.get(&ident) { + ctx.scopes.def_mut(ident.take(), slot.borrow().clone()); } else { - bail!(ident.span, "unresolved import"); + bail!(ident.span(), "unresolved import"); } } } @@ -691,12 +694,12 @@ impl Access for Expr { impl Access for Ident { fn access<'a>(&self, ctx: &'a mut EvalContext) -> TypResult<RefMut<'a, Value>> { - match ctx.scopes.get(&self.string) { + match ctx.scopes.get(self) { Some(slot) => match slot.try_borrow_mut() { Ok(guard) => Ok(guard), - Err(_) => bail!(self.span, "cannot mutate a constant"), + Err(_) => bail!(self.span(), "cannot mutate a constant"), }, - None => bail!(self.span, "unknown variable"), + None => bail!(self.span(), "unknown variable"), } } } |
