From 408076be6aed70bc21dd01065dad9d99f05d3a27 Mon Sep 17 00:00:00 2001 From: Stefan Israelsson Tampe Date: Fri, 23 Feb 2018 13:12:17 +0100 Subject: operator.scm --- modules/language/python/module/collections/abc.scm | 334 +++++++++++++++++++++ 1 file changed, 334 insertions(+) create mode 100644 modules/language/python/module/collections/abc.scm (limited to 'modules/language/python/module/collections/abc.scm') diff --git a/modules/language/python/module/collections/abc.scm b/modules/language/python/module/collections/abc.scm new file mode 100644 index 0000000..c056834 --- /dev/null +++ b/modules/language/python/module/collections/abc.scm @@ -0,0 +1,334 @@ +(define-module (language python module collections abc) + #:use-module (oop pf-objects) + #:export (Container Hashable Iterable Iterator Reversable Generator + Sized Callable Collection Sequence MutableSequence + ByteString Set MutableSet Mapping MutableMapping + MappingView ItemsView KeysView ValuesView)) + +(define-python-class Container () + (define __containes__ + (lambda x (error "not implemented")))) + +(define-python.class Hashable () + (define __hash__ + (lambda x (error "not implemented")))) + +(define-python-class Iterable () + (define __iter__ + (lambda x (error "not implemented")))) + +(define-python-class Iterator (Iterable) + ;; Mixin + (define __iter__ + (lambda (self) self)) + + ;; Abstract + (define __next__ + (lambda x (error "not implemented")))) + +(define-python-class Reversable (Iterable) + (define __reversed__ + (lambda x (error "not implemented")))) + +(define-python-class Generator (Iterator) + ;; Mixin + (define __next__ + (lambda (self) ((ref self 'send)))) + + (define close + (lambda (self) + ((ref self 'throw) GeneratorExit))) + + ;; Abstract + (define send + (lambda x (error "not implemented"))) + (define throw + (lambda x (error "not implemented")))) + +(define-python-class Sized () + (define __len__ + (lambda x (error "not implemented")))) + +(define-python-class Callable () + (define __call__ + (lambda x (error "not implemented")))) + +(define-python-class Collection (Sized Iterable Container)) + +(define-python-class Sequence (Reversable Collection) + ;; Mixin + (define __contains__ + (lambda (self x) + (let ((f (ref self '__getitem))) + (for ((i : (range (len self)))) + (if (equal? x (f i)) + (break #t)) + #:final #f)))) + + (define __iter__ + (lambda (self) + ((mk-iterator + (lambda (yield) + (let ((f (ref self '__getitem))) + (for ((i : (range (len self)))) + (yield (f i))))))))) + + (define __reversed__ + (lambda (self) + ((mk-iterator + (lambda (yield) + (let ((f (ref self '__getitem))) + (for ((i : (range (len self) 0 -1))) + (yield (f i))))))))) + + (define index + (lambda (self x) + (let ((f (ref self '__getitem__))) + (for ((i : (range (len self)))) + (if (equal? x (f i)) + (break y)) + (raise IndexError))))) + + (define count + (lambda (self x) + (let ((f (ref self '__getitem__))) + (for ((i : (range (len self)))) ((n 0)) + (if (equal? x (f i)) + (+ n 1) + n) + #:final n)))) + + + ;; Abstract + (define __getitem__ + (lambda x (error "not implemented")))) + +(define-python-class MutableSequence (Sequence) + ;; Mixin + (define append + (lambda (self x) + ((ref self 'insert) (len self) x))) + + (define extend + (lambda (self it) + (let ((f (ref self 'insert))) + (for ((x : it)) ((i (len self))) + (f i x) + (+ i 1))) + (values))) + + (define pop + (lambda (self) + (let* ((i (- (len self) 1)) + (x ((ref self '__getitem__) i))) + ((ref self '__delitem__) i) + x))) + + (define remove + (lambda (self x) + (let ((f (ref self '__getitem__))) + (for ((i : (range (len self)))) + (if (equal? x (f i)) + (begin + ((ref self '__delitem__) i) + (break))))) + (values))) + + + (define __iadd__ + (lambda (self seq) + (let ((f (ref self 'insert))) + (for ((x : seq)) ((i (len self))) + (f i x) + (+ i 1))) + (values))) + + + ;; Abstract + (define __setitem__ + (lambda x (error "not implemented"))) + (define __delitem__ + (lambda x (error "not implemented"))) + (define insert + (lambda x (error "not implemented")))) + +(define-python-class ByteString (Sequence)) + +(define-python-class Set (Collection) + ;; Mixins + (define __le__ + (lambda (self o) + (let ((f (ref o '__contains__))) + (for ((x : ((ref self '__iter__)))) + (if (not (f x)) + (break #f)))))) + + (define __lt__ + (lambda (self o) + (if (equal? (len self) (len o)) + #f + (let ((f (ref o '__contains__))) + (for ((x : ((ref self '__iter__)))) + (if (not (f x)) + (break #f))))))) + + (define __eq__ + (lambda (self o) + (if (not (equal? (len self) (len o))) + #f + (let ((f (ref o '__contains__))) + (for ((x : ((ref self '__iter__)))) + (if (not (f x)) + (break #f))))))) + + (define __ne__ + (lambda (self o) (not ((ref self '__eq__) o)))) + + (define __gt__ + (lambda (self o) + (if (equal? (len self) (len o)) + #f + (let ((f (ref self '__contains__))) + (for ((x : ((ref o '__iter__)))) + (if (not (f x)) + (break #f))))))) + + (define __ge__ + (lambda (self o) + (let ((f (ref self '__contains__))) + (for ((x : ((ref o '__iter__)))) + (if (not (f x)) + (break #f)))))) + + (define __and__ + (lambda (self o) + (let ((f (ref o '__contains__)) + (s (set)) + (a (ref s 'add))) + (for ((x : ((ref self '__iter__)))) () + (if (f x) + (a x))) + s))) + + (define __or__ + (lambda (self o) + (let ((s (set)) + (a (ref s 'add))) + (for ((x : ((ref self '__iter__)))) () + (a x)) + (for ((x : ((ref o '__iter__)))) () + (a x)) + s))) + + (define __sub__ + (lambda (self o) + (let ((f (ref o '__contains__)) + (s (set)) + (a (ref s 'add))) + (for ((x : ((ref self '__iter__)))) () + (if (not (f x)) + (a x))) + s))) + + (define __xor__ + (lambda (self o) + (let ((fo (ref o '__contains__)) + (fs (ref self '__contains__)) + (s (set)) + (a (ref s 'add))) + (for ((x : ((ref self '__iter__)))) () + (if (not (fo x)) + (a x))) + (for ((x : ((ref o '__iter__)))) () + (if (not (fs x)) + (a x))) + s))) + + (define disjoint + (lambda (self o) + (let ((f (ref o '__contains__)) + (s (set)) + (a (ref s 'add))) + (for ((x : ((ref self '__iter__)))) () + (if (f x) + (break #f)) + #:final #t))))) + +(define-python-class MutableSet (Set) + ;; Abstract methods + (define add + (lambda x (error "not implemented"))) + (define discard + (lambda x (error "not implemented"))) + + ;; Mixins + (define clear) + (define pop) + (define remove) + (define __ior__) + (define __iand__) + (define __ixor__) + (define __isub__)) + +(define-python-class Mapping (Collection) + ;; Mixins + (define __contains__) + (define keys) + (define items) + (define values) + (define get) + (define __eq__) + (define __ne__)) + +(define-python-class MutableMapping (Mapping) + ;; Abstracts + (define __setitem__) + (define __delitem__) + + ;; Mixins + (define pop) + (define popitem) + (define clear) + (define update) + (define setdefault)) + +(define-python-class MappingView (Sized) + ;; Mixins + (define __init__ + (lambda (self m) + (set self '_mapping m))) + + (define __len__ + (lambda (self) (len (ref self '_mapping))))) + +(define-python-class ItemsView (MappingView Set) + ;; Mixins + (define __contains__ + (lambda (self x))) + (define __iter__ + (lambda (self) + ((ref (ref self '_mapping) 'items))))) + +(define-python-class KeysView (MappingView Set) + ;; Mixins + (define __contains__ + (lambda (self k))) + + (define __iter__ + (lambda (self) + ((ref (ref self '_mapping) 'keys))))) + +(define-python-class ValuesView (MappingView) + ;; Mixins + (define __contains__ + (lambda (self x))) + + (define __iter__ + (lambda (self) + ((ref (ref self '_mapping) 'values))))) + + +(name-object Container Hashable Iterable Iterator Reversable Generator + Sized Callable Collection Sequence MutableSequence + ByteString Set MutableSet Mapping MutableMapping + MappingView ItemsView KeysView ValuesView) -- cgit v1.2.3