aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEdvard Thörnros <edvard.thornros@gmail.com>2021-03-08 23:39:59 +0100
committerEdvard Thörnros <edvard.thornros@gmail.com>2021-03-08 23:39:59 +0100
commitfe3909375bd0b200989b9d88158e8c3412b3d639 (patch)
treeeab2da268ffa968888e2d45b3a0e24761d56745c
parentd6b4e028462f24861b8386dbd919f9ef977d9f01 (diff)
downloadsylt-fe3909375bd0b200989b9d88158e8c3412b3d639.tar.gz
change how tuple comparison functions
-rw-r--r--progs/tests/sub.sy3
-rw-r--r--src/lib.rs16
2 files changed, 16 insertions, 3 deletions
diff --git a/progs/tests/sub.sy b/progs/tests/sub.sy
index e5d60f2..cca4f2c 100644
--- a/progs/tests/sub.sy
+++ b/progs/tests/sub.sy
@@ -1,3 +1,4 @@
start :: fn {
- (1, -2, 3, -4) - (4, 3, -2, -1) <=> (-3, 1, 1, -5)
+ print (1, -2, 3, -4) - (4, 3, -2, -1)
+ (1, -2, 3, -4) - (4, 3, -2, -1) <=> (-3, -5, 5, -3)
}
diff --git a/src/lib.rs b/src/lib.rs
index e7c4a35..c085cca 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -681,7 +681,13 @@ mod op {
(Value::Int(a), Value::Int(b)) => Value::Bool(a == b),
(Value::String(a), Value::String(b)) => Value::Bool(a == b),
(Value::Bool(a), Value::Bool(b)) => Value::Bool(a == b),
- (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_bin_op(a, b, eq),
+ (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => {
+ a.iter().zip(b.iter()).find_map(
+ |(a, b)| match eq(a, b) {
+ Value::Bool(true) => None,
+ a => Some(a),
+ }).unwrap_or(Value::Bool(true))
+ }
(Value::Unknown, a) | (a, Value::Unknown) if !matches!(a, Value::Unknown) => eq(a, a),
(Value::Unknown, Value::Unknown) => Value::Unknown,
(Value::Union(a), b) | (b, Value::Union(a)) => union_bin_op(&a, b, eq),
@@ -696,7 +702,13 @@ mod op {
(Value::Int(a), Value::Int(b)) => Value::Bool(a < b),
(Value::String(a), Value::String(b)) => Value::Bool(a < b),
(Value::Bool(a), Value::Bool(b)) => Value::Bool(a < b),
- (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => tuple_bin_op(a, b, less),
+ (Value::Tuple(a), Value::Tuple(b)) if a.len() == b.len() => {
+ a.iter().zip(b.iter()).find_map(
+ |(a, b)| match less(a, b) {
+ Value::Bool(true) => None,
+ a => Some(a),
+ }).unwrap_or(Value::Bool(true))
+ }
(Value::Unknown, a) | (a, Value::Unknown) if !matches!(a, Value::Unknown) => less(a, a),
(Value::Unknown, Value::Unknown) => Value::Unknown,
(Value::Union(a), b) | (b, Value::Union(a)) => union_bin_op(&a, b, less),