summaryrefslogtreecommitdiff
path: root/src/eval
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2021-07-08 19:12:07 +0200
committerLaurenz <laurmaedje@gmail.com>2021-07-08 19:12:07 +0200
commit5a500fb8a7c0ba4b8a59e2622c8cbafdc4ce1fe9 (patch)
tree5c22b012cf2c37a96735d6ec84ad19e852259e51 /src/eval
parentc5635d8a3f45865619d66bc9e296da7d9e9efa5a (diff)
Range operator
Diffstat (limited to 'src/eval')
-rw-r--r--src/eval/mod.rs1
-rw-r--r--src/eval/ops.rs8
2 files changed, 9 insertions, 0 deletions
diff --git a/src/eval/mod.rs b/src/eval/mod.rs
index 96ac87a9..ba2de8c7 100644
--- a/src/eval/mod.rs
+++ b/src/eval/mod.rs
@@ -383,6 +383,7 @@ impl Eval for BinaryExpr {
BinOp::SubAssign => self.assign(ctx, ops::sub),
BinOp::MulAssign => self.assign(ctx, ops::mul),
BinOp::DivAssign => self.assign(ctx, ops::div),
+ BinOp::Range => self.apply(ctx, ops::range),
}
}
}
diff --git a/src/eval/ops.rs b/src/eval/ops.rs
index 2537f4a5..01044842 100644
--- a/src/eval/ops.rs
+++ b/src/eval/ops.rs
@@ -250,6 +250,14 @@ comparison!(leq, Less | Equal);
comparison!(gt, Greater);
comparison!(geq, Greater | Equal);
+/// Compute the range from `lhs` to `rhs`.
+pub fn range(lhs: Value, rhs: Value) -> Value {
+ match (lhs, rhs) {
+ (Int(a), Int(b)) => Array((a ..= b).map(Int).collect()),
+ _ => Error,
+ }
+}
+
/// Concatenate two collections.
fn concat<T, A>(mut a: T, b: T) -> T
where