summaryrefslogtreecommitdiff
path: root/src/eval/args.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval/args.rs')
-rw-r--r--src/eval/args.rs21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/eval/args.rs b/src/eval/args.rs
index 8617bd93..bea2baa1 100644
--- a/src/eval/args.rs
+++ b/src/eval/args.rs
@@ -62,14 +62,23 @@ impl Args {
}
/// Consume n positional arguments if possible.
- pub fn consume(&mut self, n: usize) -> SourceResult<EcoVec<Arg>> {
- if n > self.items.len() {
+ pub fn consume(&mut self, n: usize) -> SourceResult<Vec<Arg>> {
+ let mut list = vec![];
+
+ let mut i = 0;
+ while i < self.items.len() && list.len() < n {
+ if self.items[i].name.is_none() {
+ list.push(self.items.remove(i));
+ } else {
+ i += 1;
+ }
+ }
+
+ if list.len() < n {
bail!(self.span, "not enough arguments");
}
- let vec = self.items.to_vec();
- let (left, right) = vec.split_at(n);
- self.items = right.into();
- Ok(left.into())
+
+ Ok(list)
}
/// Consume and cast the first positional argument.