summaryrefslogtreecommitdiff
path: root/src/eval/mod.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2022-01-29 21:36:25 +0100
committerLaurenz <laurmaedje@gmail.com>2022-01-29 21:36:25 +0100
commit24d513d8917de0a8c23916837e5ea7fbb550db8b (patch)
treea19a64099a96bab44a7a12f58b1515326925a695 /src/eval/mod.rs
parent3cad6bf60785d899ecb78b557bf7ba3cd8903e56 (diff)
Enable for loop over captured args
Diffstat (limited to 'src/eval/mod.rs')
-rw-r--r--src/eval/mod.rs25
1 files changed, 11 insertions, 14 deletions
diff --git a/src/eval/mod.rs b/src/eval/mod.rs
index d459ba6e..05fa7eba 100644
--- a/src/eval/mod.rs
+++ b/src/eval/mod.rs
@@ -642,16 +642,8 @@ impl Eval for CallArgs {
value: Spanned::new(value, span),
}));
}
- v => {
- if let Value::Dyn(dynamic) = &v {
- if let Some(args) = dynamic.downcast::<Args>() {
- items.extend(args.items.iter().cloned());
- continue;
- }
- }
-
- bail!(expr.span(), "cannot spread {}", v.type_name())
- }
+ Value::Args(args) => items.extend(args.items),
+ v => bail!(expr.span(), "cannot spread {}", v.type_name()),
},
}
}
@@ -716,10 +708,6 @@ impl Eval for ClosureExpr {
// Put the remaining arguments into the sink.
if let Some(sink) = &sink {
- dynamic! {
- Args: "arguments",
- }
-
ctx.scopes.def_mut(sink, args.take());
}
@@ -868,6 +856,15 @@ impl Eval for ForExpr {
(Some(k), v, Value::Dict(dict)) => {
iter!(for (k => key, v => value) in dict.into_iter());
}
+ (None, v, Value::Args(args)) => {
+ iter!(for (v => value) in args.items.into_iter()
+ .filter(|arg| arg.name.is_none())
+ .map(|arg| arg.value.v));
+ }
+ (Some(k), v, Value::Args(args)) => {
+ iter!(for (k => key, v => value) in args.items.into_iter()
+ .map(|arg| (arg.name.map_or(Value::None, Value::Str), arg.value.v)));
+ }
(_, _, Value::Str(_)) => {
bail!(pattern.span(), "mismatched pattern");
}