From fe3909375bd0b200989b9d88158e8c3412b3d639 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edvard=20Th=C3=B6rnros?= Date: Mon, 8 Mar 2021 23:39:59 +0100 Subject: change how tuple comparison functions --- progs/tests/sub.sy | 3 ++- src/lib.rs | 16 ++++++++++++++-- 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), -- cgit v1.2.1