From 0f66dc88c5cc95f1dee7e4698c079a5554ddc886 Mon Sep 17 00:00:00 2001 From: Stefan Israelsson Tampe Date: Tue, 27 Feb 2018 13:46:43 +0100 Subject: abc compiles --- modules/language/python/module/collections/abc.scm | 354 +++++++++++++++++---- 1 file changed, 286 insertions(+), 68 deletions(-) (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 index c056834..d526e73 100644 --- a/modules/language/python/module/collections/abc.scm +++ b/modules/language/python/module/collections/abc.scm @@ -1,15 +1,29 @@ (define-module (language python module collections abc) #:use-module (oop pf-objects) + #:use-module (language python for) + #:use-module (language python try) + #:use-module (language python exceptions) + #:use-module (language python def) + #:use-module (language python set) + #:use-module (language python list) + #:use-module (language python range) + #:use-module (language python yield) + #:use-module (language python persist) #:export (Container Hashable Iterable Iterator Reversable Generator Sized Callable Collection Sequence MutableSequence ByteString Set MutableSet Mapping MutableMapping MappingView ItemsView KeysView ValuesView)) +(define s:set (@@ (language python set) set)) + +(define-syntax-rule (aif it p x y) (let ((it p)) (if it x y))) + + (define-python-class Container () (define __containes__ (lambda x (error "not implemented")))) -(define-python.class Hashable () +(define-python-class Hashable () (define __hash__ (lambda x (error "not implemented")))) @@ -59,34 +73,34 @@ ;; Mixin (define __contains__ (lambda (self x) - (let ((f (ref self '__getitem))) - (for ((i : (range (len self)))) - (if (equal? x (f i)) + (let ((get (ref self '__getitem))) + (for ((i : (range (len self)))) () + (if (equal? x (get i)) (break #t)) #:final #f)))) (define __iter__ (lambda (self) - ((mk-iterator + ((make-generator (lambda (yield) (let ((f (ref self '__getitem))) - (for ((i : (range (len self)))) + (for ((i : (range (len self)))) () (yield (f i))))))))) (define __reversed__ (lambda (self) - ((mk-iterator + ((make-generator (lambda (yield) (let ((f (ref self '__getitem))) - (for ((i : (range (len self) 0 -1))) + (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)))) + (for ((i : (range (len self)))) () (if (equal? x (f i)) - (break y)) + (break i)) (raise IndexError))))) (define count @@ -103,6 +117,7 @@ (define __getitem__ (lambda x (error "not implemented")))) + (define-python-class MutableSequence (Sequence) ;; Mixin (define append @@ -127,7 +142,7 @@ (define remove (lambda (self x) (let ((f (ref self '__getitem__))) - (for ((i : (range (len self)))) + (for ((i : (range (len self)))) () (if (equal? x (f i)) (begin ((ref self '__delitem__) i) @@ -152,14 +167,17 @@ (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__)))) + (let ((f (aif it (ref o '__contains__) + it + (lambda (x) (in x o))))) + (for ((x : self)) () (if (not (f x)) (break #f)))))) @@ -167,8 +185,10 @@ (lambda (self o) (if (equal? (len self) (len o)) #f - (let ((f (ref o '__contains__))) - (for ((x : ((ref self '__iter__)))) + (let ((f (aif it (ref o '__contains__) + it + (lambda (x) (in x o))))) + (for ((x : self)) () (if (not (f x)) (break #f))))))) @@ -176,8 +196,10 @@ (lambda (self o) (if (not (equal? (len self) (len o))) #f - (let ((f (ref o '__contains__))) - (for ((x : ((ref self '__iter__)))) + (let ((f (aif it (ref o '__contains__) + it + (lambda (x) (in x o))))) + (for ((x : self)) () (if (not (f x)) (break #f))))))) @@ -189,71 +211,75 @@ (if (equal? (len self) (len o)) #f (let ((f (ref self '__contains__))) - (for ((x : ((ref o '__iter__)))) + (for ((x : o)) () (if (not (f x)) (break #f))))))) (define __ge__ (lambda (self o) (let ((f (ref self '__contains__))) - (for ((x : ((ref o '__iter__)))) + (for ((x : o)) () (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__)))) () + (let* ((f (aif it (ref o '__contains__) + it + (lambda (x) (in x o)))) + (s (s:set)) + (a (ref s 'add))) + (for ((x : self)) () (if (f x) (a x))) s))) (define __or__ (lambda (self o) - (let ((s (set)) - (a (ref s 'add))) - (for ((x : ((ref self '__iter__)))) () + (let* ((s (s:set)) + (a (ref s 'add))) + (for ((x : self)) () (a x)) - (for ((x : ((ref o '__iter__)))) () + (for ((x : o)) () (a x)) s))) (define __sub__ (lambda (self o) - (let ((f (ref o '__contains__)) - (s (set)) - (a (ref s 'add))) - (for ((x : ((ref self '__iter__)))) () + (let* ((f (ref o '__contains__)) + (s (s:set)) + (a (ref s 'add))) + (for ((x : self)) () (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__)))) () + (let* ((fo (aif it (ref o '__contains__) + it + (lambda (x) (in x o)))) + (fs (ref self '__contains__)) + (s (s:set)) + (a (ref s 'add))) + (for ((x : self)) () (if (not (fo x)) (a x))) - (for ((x : ((ref o '__iter__)))) () + (for ((x : o)) () (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__)))) () + (let ((f (aif it (ref o '__contains__) + it + (lambda (x) (in x o))))) + (for ((x : self)) () (if (f x) (break #f)) #:final #t))))) - + (define-python-class MutableSet (Set) ;; Abstract methods (define add @@ -262,35 +288,212 @@ (lambda x (error "not implemented"))) ;; Mixins - (define clear) - (define pop) - (define remove) - (define __ior__) - (define __iand__) - (define __ixor__) - (define __isub__)) + (define clear + (lambda (self) + (define discard (ref self 'discard)) + (for ((x : (for ((x : self)) ((l '())) + (cons x l) + #:final l))) () + (discard x)))) + + + + (define pop + (lambda (self) + (let ((x (for ((x : self)) () + (break x) + #:final + (raise KeyError)))) + ((ref self 'discard) x) + x))) + + (define remove + (lambda (self x) + (if (in x self) + ((ref self 'discard) x) + (raise KeyError)))) + + (define __ior__ + (lambda (self o) + (let ((add (ref self 'add))) + (for ((x : o)) () + (add x))))) + + (define __iand__ + (lambda (self o) + (define o-contains (aif it (ref o '__contains__) + it + (lambda (x) (in o x)))) + + (define s-discard (ref self 'discard)) + + (for ((x : (for ((x : self)) ((l '())) + (if (o-contains x) + l + (cons x l))))) () + + (s-discard x)))) + + + (define __ixor__ + (lambda (self o) + (define o-contains (aif it (ref o '__contains__) + it + (lambda (x) (in o x)))) + + (define s-contains (ref self '__contains__)) + (define s-add (ref self 'add)) + (define s-discard (ref self 'discard)) + + (let ((rems (for ((x : self)) ((l '())) + (if (o-contains x) + (cons x l) + l) + #:final l)) + (adds (for ((x : o)) ((l '())) + (if (s-contains x) + l + (cons x l))))) + (let lp ((rems rems)) + (if (pair? rems) + (begin + (s-discard (car rems)) + (lp (cdr rems))))) + (let lp ((adds adds)) + (if (pair? adds) + (begin + (s-add (car adds)) + (lp (cdr adds)))))))) + + + (define __isub__ + (lambda (self o) + (define o-contains (aif it (ref o '__contains__) + it + (lambda (x) (in o x)))) + + (define s-discard (ref self 'discard)) + + (let ((rems (for ((x : self)) ((l '())) + (if (o-contains x) + (cons x l) + l) + #:final l))) + + (let lp ((rems rems)) + (if (pair? rems) + (begin + (s-discard (car rems)) + (lp (cdr rems))))))))) (define-python-class Mapping (Collection) + ;; Abstract + (define __getitem__ + (lambda x (error "not implemented"))) + ;; Mixins - (define __contains__) - (define keys) - (define items) - (define values) - (define get) - (define __eq__) - (define __ne__)) + (define __contains__ + (lambda (self x) + (try + (lambda () (ref self '__getitem__ x) #t) + (#:except KeyError => (lambda x #f))))) + + (define keys + (lambda (self) + (for ((k v : self)) ((l '())) + (cons k l) + #:final (reverse l)))) + + (define items + (lambda (self) + (for ((k v : self)) ((l '())) + (cons (cons k v) l) + #:final (reverse l)))) + + (define values + (lambda (self) + (for ((k v : self)) ((l '())) + (cons v l) + #:final (reverse l)))) + + (define get + (lambda* (self x #:optional (d None)) + (try + (lambda () (ref self '__getitem__ x)) + (#:except KeyError => (lambda x d))))) + + (define __eq__ + (lambda (self o) + (define o-ref (aif it (ref o '__getitem__) + it + (lambda (x) (pylist-ref o x)))) + (try + (lambda () + (for ((k v : o)) () + (if (not (equal? v (o-ref k))) + (break #f)) + #:final #t)) + (#:except KeyError => (lambda x #f))))) + + (define __ne__ + (lambda (self o) + (not ((ref self '__eq__) o))))) (define-python-class MutableMapping (Mapping) ;; Abstracts - (define __setitem__) - (define __delitem__) + (define __setitem__ (lambda x (error "not implemented"))) + (define __delitem__ (lambda x (error "not implemented"))) ;; Mixins - (define pop) - (define popitem) - (define clear) - (define update) - (define setdefault)) + (define pop + (lambda* (self k #:optional (d None)) + (try + (lambda () + (define v (pylist-ref self k)) + ((ref self '__delitem__) k) + v) + (#:except KeyError => (lambda x d))))) + + (define popitem + (lambda (self) + (for ((k v : self)) () + (break k v) + #:final + (raise KeyError)))) + + (define clear + (lambda (self) + (define l (for ((k v : self)) ((l '())) + (cons k l) + #:final l)) + (define rem (ref self '__delitem__)) + (let lp ((l l)) + (if (pair? l) + (begin + (rem (car l)) + (lp (cdr l))))))) + + (define update + (lam (self (* e) (** f)) + (define add (ref self '__setitem__)) + (let lp ((e e)) + (if (pair? e) + (begin + (for ((k v : (car e))) () + (add k v)) + (lp (cdr e))))) + (for ((k v : f)) () + (add k v)))) + + (define setdefault + (lambda* (self k #:optional (d None)) + (try + (lambda () ((ref self '__getitem__) k)) + (#:except KeyError => + (lambda x + ((ref self '__setitem__) k d) + d)))))) + (define-python-class MappingView (Sized) ;; Mixins @@ -304,7 +507,13 @@ (define-python-class ItemsView (MappingView Set) ;; Mixins (define __contains__ - (lambda (self x))) + (lambda (self x) + (let ((m (ref self '_mapping)) + (k (car x)) + (v (cdr x))) + (and (in k m) + (equal? v (pylist-ref self k)))))) + (define __iter__ (lambda (self) ((ref (ref self '_mapping) 'items))))) @@ -312,8 +521,10 @@ (define-python-class KeysView (MappingView Set) ;; Mixins (define __contains__ - (lambda (self k))) - + (lambda (self k) + (let ((m (ref self '_mapping))) + (in k m)))) + (define __iter__ (lambda (self) ((ref (ref self '_mapping) 'keys))))) @@ -321,8 +532,13 @@ (define-python-class ValuesView (MappingView) ;; Mixins (define __contains__ - (lambda (self x))) - + (lambda (self x) + (let ((m (ref self '_mapping))) + (for ((k v : m)) () + (if (equal? v x) + (break #t)) + #:final #f)))) + (define __iter__ (lambda (self) ((ref (ref self '_mapping) 'values))))) @@ -332,3 +548,5 @@ Sized Callable Collection Sequence MutableSequence ByteString Set MutableSet Mapping MutableMapping MappingView ItemsView KeysView ValuesView) + + -- cgit v1.2.3