From fdd9ec19239f5f2e9f94bdc29f424be0bf0390a5 Mon Sep 17 00:00:00 2001 From: DoDaek Date: Sun, 22 Sep 2019 21:36:29 +0900 Subject: [PATCH 1/2] set: Implement __sub__ of set --- py/set.go | 17 +++++++++++++++++ py/tests/set.py | 15 +++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/py/set.go b/py/set.go index af4eb4e5..6fa10a8f 100644 --- a/py/set.go +++ b/py/set.go @@ -142,6 +142,23 @@ func (s *Set) M__or__(other Object) (Object, error) { return ret, nil } +func (s *Set) M__sub__(other Object) (Object, error) { + ret := NewSet() + b, ok := other.(*Set) + if !ok { + return nil, ExceptionNewf(TypeError, "unsupported operand type(s) for &: '%s' and '%s'", s.Type().Name, other.Type().Name) + } + for j := range s.items { + ret.items[j] = SetValue{} + } + for i := range b.items { + if _, ok := s.items[i]; ok { + delete(ret.items, i) + } + } + return ret, nil +} + // Check interface is satisfied var _ I__len__ = (*Set)(nil) var _ I__bool__ = (*Set)(nil) diff --git a/py/tests/set.py b/py/tests/set.py index e46b412a..1309c016 100644 --- a/py/tests/set.py +++ b/py/tests/set.py @@ -30,4 +30,19 @@ assert 4 in c assert 5 in c +doc="__sub__" +a = {1, 2, 3} +b = {2, 3, 4, 5} +c = a.__sub__(b) +d = b.__sub__(a) +assert 1 in c +assert 4 in d +assert 5 in d + +e = a - b +f = b - a +assert 1 in c +assert 4 in d +assert 5 in d + doc="finished" \ No newline at end of file From 3b404c485c16f3a5e92beceefc7d4cd10676ac90 Mon Sep 17 00:00:00 2001 From: DoDaek Date: Sun, 22 Sep 2019 21:37:47 +0900 Subject: [PATCH 2/2] set: Implement __xor__ of set --- py/set.go | 20 ++++++++++++++++++++ py/tests/set.py | 13 +++++++++++++ 2 files changed, 33 insertions(+) diff --git a/py/set.go b/py/set.go index 6fa10a8f..a27143ba 100644 --- a/py/set.go +++ b/py/set.go @@ -159,6 +159,26 @@ func (s *Set) M__sub__(other Object) (Object, error) { return ret, nil } +func (s *Set) M__xor__(other Object) (Object, error) { + ret := NewSet() + b, ok := other.(*Set) + if !ok { + return nil, ExceptionNewf(TypeError, "unsupported operand type(s) for &: '%s' and '%s'", s.Type().Name, other.Type().Name) + } + for j := range s.items { + ret.items[j] = SetValue{} + } + for i := range b.items { + _, ok := s.items[i] + if ok { + delete(ret.items, i) + } else { + ret.items[i] = SetValue{} + } + } + return ret, nil +} + // Check interface is satisfied var _ I__len__ = (*Set)(nil) var _ I__bool__ = (*Set)(nil) diff --git a/py/tests/set.py b/py/tests/set.py index 1309c016..f6fa539a 100644 --- a/py/tests/set.py +++ b/py/tests/set.py @@ -45,4 +45,17 @@ assert 4 in d assert 5 in d +doc="__xor__" +a = {1, 2, 3} +b = {2, 3, 4, 5} +c = a.__xor__(b) +assert 1 in c +assert 4 in c +assert 5 in c + +d = a ^ b +assert 1 in c +assert 4 in c +assert 5 in c + doc="finished" \ No newline at end of file