diff options
Diffstat (limited to 'modules/language')
-rw-r--r-- | modules/language/python/compile.scm | 3 | ||||
-rw-r--r-- | modules/language/python/exceptions.scm | 32 | ||||
-rw-r--r-- | modules/language/python/module.scm | 14 | ||||
-rw-r--r-- | modules/language/python/module/collections.scm | 239 | ||||
-rw-r--r-- | modules/language/python/module/operator.scm | 15 |
5 files changed, 156 insertions, 147 deletions
diff --git a/modules/language/python/compile.scm b/modules/language/python/compile.scm index b287e4b..3e7a95a 100644 --- a/modules/language/python/compile.scm +++ b/modules/language/python/compile.scm @@ -14,6 +14,7 @@ #:use-module (language python bytes) #:use-module (language python number) #:use-module (language python def) + #:use-module (language python module) #:use-module ((language python with) #:select ()) #:use-module (ice-9 pretty-print) #:export (comp)) @@ -27,7 +28,6 @@ (define-inlinable (F x) `(@@ (language python for) ,x)) (define-inlinable (E x) `(@@ (language python exceptions) ,x)) (define-inlinable (L x) `(@@ (language python list) ,x)) -(define-inlinable (A x) `(@@ (language python array) ,x)) (define-inlinable (S x) `(@@ (language python string) ,x)) (define-inlinable (B x) `(@@ (language python bytes) ,x)) (define-inlinable (Se x) `(@@ (language python set) ,x)) @@ -835,7 +835,6 @@ ((_ (#:name ((ids ...) . as)) ...) - (pk x) `(begin ,@(map (lambda (ids as) diff --git a/modules/language/python/exceptions.scm b/modules/language/python/exceptions.scm index 9c75658..0b91293 100644 --- a/modules/language/python/exceptions.scm +++ b/modules/language/python/exceptions.scm @@ -6,24 +6,25 @@ IndexError KeyError AttributeError SyntaxError SystemException OSError ProcessLookupError PermissionError - None)) + None NotImplemented NotImplementedError)) (define-syntax-rule (aif it p x y) (let ((it p)) (if it x y))) -(define StopIteration 'StopIteration) -(define GeneratorExit 'GeneratorExit) -(define SystemException 'SystemException) -(define RuntimeError 'RuntimeError) -(define IndexError 'IndexError) -(define ValueError 'ValueError) -(define None 'None) -(define KeyError 'KeyError) -(define TypeError 'TypeError) -(define AttributeError 'AttributeError) -(define SyntaxError 'SyntaxError) -(define OSError 'OSError) -(define ProcessLookupError 'ProcessLookupError) -(define PermissionError 'PermissionError) +(define StopIteration 'StopIteration) +(define GeneratorExit 'GeneratorExit) +(define SystemException 'SystemException) +(define RuntimeError 'RuntimeError) +(define IndexError 'IndexError) +(define ValueError 'ValueError) +(define None 'None) +(define KeyError 'KeyError) +(define TypeError 'TypeError) +(define AttributeError 'AttributeError) +(define SyntaxError 'SyntaxError) +(define OSError 'OSError) +(define ProcessLookupError 'ProcessLookupError) +(define PermissionError 'PermissionError) +(define NotImplementedError 'NotImplementedError) (define-python-class Exception () (define __init__ @@ -42,6 +43,7 @@ (ref self '__name__)))))) +(define NotImplemented (list 'NotImplemented)) diff --git a/modules/language/python/module.scm b/modules/language/python/module.scm index 5da5992..9884c2b 100644 --- a/modules/language/python/module.scm +++ b/modules/language/python/module.scm @@ -11,6 +11,13 @@ (define-syntax-rule (aif it p x y) (let ((it p)) (if it x y))) +(define-syntax-rule (in-scheme x) + (let ((lan (current-language))) + (dynamic-wind + (lambda () (current-language 'scheme)) + (lambda () x) + (lambda () (current-language lan))))) + (define (private mod) ((ref mod '__setprivate__) #t)) (define (public mod) @@ -117,7 +124,7 @@ (set self '__dict__ self) (set self '__name__ (string-join (map symbol->string (reverse nm)) ".")) - (let ((_module (resolve-module (reverse l)))) + (let ((_module (in-scheme (resolve-module (reverse l))))) (set self '_export (module-public-interface _module)) (set self '_module _module) (hash-set! _modules l self)))))) @@ -171,7 +178,7 @@ (define __iter__ (lambda (self) - (define m (_m obj)) + (define m (_m self)) ((make-generator () (lambda (yield) (define l '()) @@ -181,8 +188,7 @@ (if (pair? l) (begin (apply yield (car l)) - (lp (cdr l))))) - (hash-for-each yield (slot-ref self 'h)))))))) + (lp (cdr l))))))))))) diff --git a/modules/language/python/module/collections.scm b/modules/language/python/module/collections.scm index 601ce7e..c4d5d2a 100644 --- a/modules/language/python/module/collections.scm +++ b/modules/language/python/module/collections.scm @@ -1,35 +1,40 @@ (define-module (language python module collections) + #:use-module (ice-9 control) #:use-module (oop pf-objects) + #:use-module (oop goops) #:use-module (language python module collections abc) #:use-module (language python module heapq) #:use-module (language python for) + #:use-module (language python try) #:use-module (language python yield) #:use-module (language python def) #:use-module (language python list) #:use-module (language python string) #:use-module (language python dict) + #:use-module (language python def) + #:use-module (language python set) + #:use-module (language python range) #:use-module (language python exceptions) #:use-module ((language python module python) - #:select ((map . pymap))) - - #:export (abc OrderedDict ChainMap Counter UserDict UserString UserList)) + #:select ((map . pymap) isinstance reversed classmethod iter + any repr property super sorted)) -(define-python-class class-from-dict () - (define __init__ - (lambda (self d) - (set self '__dict__ d)))) + #:use-module ((language python module operator) + #:select (itemgetter)) + + #:re-export (Container Hashable Iterable Iterator Reversable Generator + Sized Callable Collection Sequence MutableSequence + ByteString Set MutableSet Mapping MutableMapping + MappingView ItemsView KeysView ValuesView) -(define abc - (class-from-dict - (resolve-module (module-public-interface - '(language python module collections abc))))) + #:export (OrderedDict ChainMap Counter UserDict UserString UserList)) (define-python-class _OrderedDictKeysView (KeysView) (define __reversed__ (lambda (self) ((make-generator () (lambda (yield) - (for ((k v : (reversed (reg self '_mapping)))) + (for ((k v : (reversed (ref self '_mapping)))) () (yield k)))))))) (define-python-class _OrderedDictValuesView (ValuesView) @@ -37,7 +42,7 @@ (lambda (self) ((make-generator () (lambda (yield) - (for ((k v : (reversed (reg self '_mapping)))) + (for ((k v : (reversed (ref self '_mapping)))) () (yield v)))))))) (define-python-class _OrderedDictItemsView (ItemsView) @@ -45,25 +50,25 @@ (lambda (self) ((make-generator () (lambda (yield) - (for ((k v : (reversed (reg self '_mapping)))) + (for ((k v : (reversed (ref self '_mapping)))) () (yield (list k v))))))))) (define-inlinable (link) (vector 0 0 0)) -(define-inlinable (get-prev l) (vector-ref l 0)) -(define-inlinable (get-next l) (vector-ref l 1)) -(define-inlinable (get-key l) (vector-ref l 2)) +(define-inlinable (get-prev l ) (vector-ref l 0)) +(define-inlinable (get-last l ) (vector-ref l 0)) +(define-inlinable (get-first l ) (vector-ref l 1)) +(define-inlinable (get-next l ) (vector-ref l 1)) +(define-inlinable (get-key l ) (vector-ref l 2)) (define-inlinable (set-prev! l v) (vector-set! l 0 v)) (define-inlinable (set-next! l v) (vector-set! l 1 v)) (define-inlinable (set-key! l v) (vector-set! l 2 v)) -(define proxy (list 'mu)) - -(define <dict> (cons <py-hashtable> '_)) -(define dict-set! (resolve-method-c pylist-set! <dict>)) -(define dict-ref (resolve-method-c pylist-ref <dict>)) -(define dict-del! (resolve-method-c pylist-delete! <dict>)) -(define dict-pop! (resolve-method-c pylist-pop! <dict>)) -(define dict-clear! (resolve-method-c pylist-clear! <dict>)) +(define <dict> `(,<py-hashtable> . _)) +(define dict-set! (resolve-method-g pylist-set! <dict>)) +(define dict-ref (resolve-method-g pylist-ref <dict>)) +(define dict-del! (resolve-method-g pylist-delete! <dict>)) +(define dict-pop! (resolve-method-g pylist-pop! <dict>)) +(define dict-clear! (resolve-method-g py-clear <dict>)) (define-python-class OrderedDict (dict) (define __init__ @@ -71,7 +76,7 @@ (if (> (len args) 1) (raise TypeError (format #f - "expected at most 1 arguments, got %d" + "expected at most 1 arguments, got ~a" (len args)))) (try @@ -87,10 +92,10 @@ (py-apply py-update self (* args) (** kwds)))) (define __setitem__ - (lambda* (self key value #:key - (dict_setitem dict-set!) - (proxy #f) - (link link)) + (lam (self key value + (= dict_setitem dict-set!) + (= proxy #f) + (= link link)) (if (in key self) (let* ((link (link)) (root (ref self '__root)) @@ -104,9 +109,7 @@ (dict_setitem self key value))))) (define __delitem__ - (lambda* (self key #:key - (dict_delitem dict-set!) - (dict_delitem dict-del!)) + (lam (self key (= dict_delitem dict-del!)) (let ((link (pylist-pop! (ref self '__map) key)) (link_prev (get-prev link)) (link_next (get-next link))) @@ -116,7 +119,7 @@ (set-prev! link None)))) (define __iter__ - (lambda* (self #:key (get-next get-next)) + (lam (self (= get-next get-next)) ((make-generator () (lambda (yield) (let ((root (ref self '__root))) @@ -140,7 +143,7 @@ (dict-clear! self)))) (define popitem - (lambda* (self #:key (last #t)) + (lam (self (= last #t)) (if (= (len self) 0) (raise KeyError "dictionary is empty")) (let ((root (ref self '__root))) @@ -162,7 +165,7 @@ (dict-pop! self key)))))) (define move_to_end - (lambda* (self key #:key (last #t)) + (lam (self key (= last #t)) (let* ((link (pylist-ref (ref self '__map) key)) (prev (get-prev link)) (next (get-next link))) @@ -196,7 +199,7 @@ (define __marker (object)) (define pop - (lambda* (self key #:key (default __marker)) + (lam (self key (= default __marker)) (if (in key self) (let ((result (dict-ref self key))) (__delitem__ self key) @@ -206,7 +209,7 @@ default)))) (define setdefault - (lambda* (self key #:key (default None)) + (lam (self key (= default None)) (if (in key self) (dict-ref self key) (begin @@ -219,24 +222,29 @@ (define fromkeys (classmethod - (lambda* (cls iterable #key (value None)) - (let ((self (cls))) - (for ((key : iterable)) () - (__setitem__ self key value)) - self)))) + (lam (cls iterable (= value None)) + (let ((self (cls))) + (for ((key : iterable)) () + (__setitem__ self key value)) + self)))) (define __eq__ (lambda (self other) (if (isinstance other OrderedDict) - (and ((dict-equal? self other) - (all (map _equal self other))) - ((ref dict '__eq__) self other)))) + (and (for ((k1 v1 : self) (k2 v2 : other)) () + (if (not (equal? k1 k2)) + (break #f)) + #:final #t) + (equal? (ref self '_mapping) (ref other '_mapping))) + (equal? (ref self '_mapping) other))))) + + (define (u self) - (let ((s (set))) - (apply (ref s 'union) (ref self 'maps))) - s) + (let ((s (py-set))) + (apply (ref s 'union) (ref self 'maps)) + s)) (define-python-class ChainMap (MutableMapping) (define __init__ @@ -267,15 +275,15 @@ (define __len__ (lambda (self) (len (u self)))) - + (define __iter__ (lambda (self) (iter (u self)))) (define __contains__ - (lambda (self, key) - (for ((m : (ref self 'maps))) + (lambda (self key) + (for ((m : (ref self 'maps))) () (if (in key m) (break #t)) #:final #f))) @@ -286,9 +294,11 @@ (define __repr__ (lambda (self) - (format #f "~a(~a,~{,~a~})" - (ref (ref self '__class__) '__name__) - (map (lambda (x) (repr x)) (ref self 'maps))))) + (let ((l (map (lambda (x) (repr x)) (ref self 'maps)))) + (format #f "~a(~a,~{,~a~})" + (ref (ref self '__class__) '__name__) + (car l) + (cdr l))))) (define fromkeys (class-method @@ -323,30 +333,30 @@ (define __delitem__ - (lambda (self, key) + (lambda (self key) (try - (lambda () (pylist-del! (car (ref self 'maps)))) - #:except KeyError => - (lambda x - (raise KeyError - (format #f "Key not found in the first mapping: ~a" key)))))) + (lambda () (pylist-delete! (car (ref self 'maps)))) + (#:except KeyError => + (lambda x + (raise KeyError + (format #f "Key not found in the first mapping: ~a" key))))))) (define popitem (lambda (self) (try (lambda () (popitem (car (ref self 'maps)))) - #:except KeyError => - (lambda x - (raise KeyError "No keys found in the first mapping"))))) + (#:except KeyError => + (lambda x + (raise KeyError "No keys found in the first mapping")))))) (define pop (lambda (self key . args) (try - (lambda () (apply py-pop (car (ref self 'maps)) args)) - #:except KeyError => - (lambda () + (lambda () (apply pylist-pop! (car (ref self 'maps)) args)) + (#:except KeyError => + (lambda x (raise KeyError - (format #f "Key not found in the first mapping: ~ a" key)))))) + (format #f "Key not found in the first mapping: ~ a" key))))))) (define clear (lambda (self) @@ -359,7 +369,7 @@ (raise TypeError (format #f - "expected at most 1 arguments, got ~ a" + "expected at most 1 arguments, got ~a" (length args)))) ((ref (super Counter self) '__init__)) (py-apply py-update self (* args) (** kwds)))) @@ -368,17 +378,17 @@ (lambda (self key) 0)) (define most_common - (lambda* (self #:key (n None)): + (lambda* (self #:key (n None)) (if (eq? n None) - (sorted ((ref self 'items) #:key (_itemgetter 1) #:reverse #t)) - (nlargest n (py-items self) #:key (_itemgetter 1))))) + (sorted ((ref self 'items) #:key (itemgetter 1) #:reverse #t)) + (nlargest n (py-items self) #:key (itemgetter 1))))) (define elements (lambda (self) ((make-generator () (for ((k v : self)) () (if (and (number? v) (integer? v) (> v 0)) - (for ((i : range(v))) () + (for ((i : (range v))) () (yield k)))))))) (define fromkeys @@ -390,42 +400,43 @@ (lam (self (* args) (** kwds)) (if (> (len args) 1) (raise TypeError - (format #f "expected at most 1 arguments, got %d" + (format #f "expected at most 1 arguments, got ~a" (len args)))) - - (let ((iterable (pylist-get args o None))) - (if (not (eq? iterable None)) - (if (is-a? iterable <py-dict>) - (for ((elem count : iterable)) () - (pylist-set! self elem - (+ count (pylist-get self elem 0)))) - (for ((k : iterable)) () - (pylist-set! self elem - (+ 1 (pylist-get self elem 0))))))) + + (if (= (len args) 1) + (let ((iterable (iter (car args)))) + (if (not (eq? iterable None)) + (if (isinstance iterable <py-hashtable>) + (for ((elem count : iterable)) () + (pylist-set! self elem + (+ count (py-get self elem 0)))) + (for ((k : iterable)) () + (pylist-set! self k + (+ 1 (py-get self k 0)))))))) - (for ((k v : kwds)) () - (pylist-set! self k - (+ count (pylist-get self k 0)))))) + (for ((k count : kwds)) () + (pylist-set! self k + (+ count (py-get self k 0)))))) (define subtracts (lam (self (* args) (** kwds)) (if (> (len args) 1) (raise TypeError - (format #f "expected at most 1 arguments, got %d" + (format #f "expected at most 1 arguments, got ~a" (len args)))) - (let ((iterable (pylist-get args 0 None))) + (let ((iterable (py-get args 0 None))) (if (not (eq? iterable None)) - (if (is-a? iterable <py-dict>) + (if (isinstance iterable <py-hashtable>) (for ((elem count : iterable)) () (pylist-set! self elem - (- (pylist-get self elem 0) count))) + (- (py-get self elem 0) count))) (for ((elem : iterable)) () (pylist-set! self elem - (- (pylist-get self elem 0) 1)))))) + (- (py-get self elem 0) 1)))))) (for ((k v : kwds)) () (pylist-set! self k - (- (pylist-get self k 0) v))))) + (- (py-get self k 0) v))))) (define __delitem__ (lambda (self k) @@ -443,12 +454,12 @@ (if (> newcount 0) (pylist-set! result elem newcount)))) - (for ((elem count : other)) + (for ((elem count : other)) () (if (and (not (in elem self)) (> count 0)) (pylist-set! result elem count))) - return)))) + result)))) (define __sub__ (lambda (self other) @@ -460,12 +471,12 @@ (if (> newcount 0) (pylist-set! result elem newcount)))) - (for ((elem count : other)) + (for ((elem count : other)) () (if (and (not (in elem self)) (> count 0)) (pylist-set! result elem (- count)))) - return)))) + result)))) (define __or__ (lambda (self other) @@ -482,7 +493,7 @@ (> count 0)) (pylist-set! result elem count))) - return)))) + result)))) (define __and__ (lambda (self other) @@ -493,12 +504,12 @@ (let ((newcount (min count (pylist-ref other elem)))) (if (> newcount 0) (pylist-set! result elem newcount)))) - return)))) + result)))) (define __pos__ (lambda (self) (let ((result (Counter))) - (for ((elem count : self)) + (for ((elem count : self)) () (if (> count 0) (pylist-set! result elem count))) result))) @@ -515,7 +526,7 @@ (define _keep_positive (lambda (self) (define ks - (for ((k v : self)) (l '()) + (for ((k v : self)) ((l '())) (if (<= v 0) (cons k l) l))) @@ -527,35 +538,35 @@ self)) (define __iadd__ - (lambda (self, other) - (for ((elem count : other)) + (lambda (self other) + (for ((elem count : other)) () (pylist-set! self elem - (+ (pylist-get self elem 0) count))) + (+ (py-get self elem 0) count))) ((ref self '_keep_positive)))) (define __isub__ - (lambda (self, other) - (for ((elem count : other)) + (lambda (self other) + (for ((elem count : other)) () (pylist-set! self elem - (- (pylist-get self elem 0) count))) + (- (py-get self elem 0) count))) ((ref self '_keep_positive)))) (define __ior__ - (lambda (self, other) - (for ((elem count : other)) + (lambda (self other) + (for ((elem count : other)) () (pylist-set! self elem - (max (pylist-get self elem 0) count))) + (max (py-get self elem 0) count))) ((ref self '_keep_positive)))) (define __iand__ - (lambda (self, other) - (for ((elem count : other)) + (lambda (self other) + (for ((elem count : other)) () (pylist-set! self elem - (min (pylist-get self elem 0) count))) + (min (py-get self elem 0) count))) ((ref self '_keep_positive))))) (define-python-class UserDict (dict)) -(define-python-class UserString (py-string)) +(define-python-class UserString (pystring)) (define-python-class UserList (py-list)) diff --git a/modules/language/python/module/operator.scm b/modules/language/python/module/operator.scm index a22fde4..e506817 100644 --- a/modules/language/python/module/operator.scm +++ b/modules/language/python/module/operator.scm @@ -34,7 +34,7 @@ (cons (cons k v) l) #:final (reverse l))) -(define (asssoc->hash a) +(define (assoc->hash a) (let ((h (make-hash-table))) (let lp ((a a)) (if (pair? a) @@ -182,8 +182,6 @@ (car as) (cdr as)))))) -(name-object attrgetter) - (define-python-class itemgetter () (define __init__ (lambda (self item . items) @@ -217,10 +215,6 @@ (ref (ref self '__class__) '__name__) (car args) (cdr args)))))) -(name-object itemgetter) - - - (define-python-class methodcaller () (define __init__ (lam (self (* args) (** kwargs)) @@ -240,12 +234,12 @@ (lambda (self) (list (lambda (o name args a) - (let ((kwargs (assoc->hash kwargs))) + (let ((kwargs (assoc->hash a))) (py-apply (ref methodcaller '__init__) o name (* args) (** kwargs)))) (list (ref self '_name) (ref self '_args) - (hash->assoc (ref self '_kwargs))))))) + (hash->assoc (ref self '_kwargs)))))) (define __call__ (lambda (self obj) @@ -267,9 +261,6 @@ #:final (reverse l))) (format #f "~a(~a~{,~a~})" cln (car v2) (cdr v2))))) -(name-object methodcaller) - - ;; In-place Operations (define iadd py-iadd) (define iand py-ilogand) |