diff options
author | Stefan Israelsson Tampe <stefan.itampe@gmail.com> | 2018-03-22 10:40:03 +0100 |
---|---|---|
committer | Stefan Israelsson Tampe <stefan.itampe@gmail.com> | 2018-03-22 10:40:03 +0100 |
commit | 1f86ca7767d661a42b3e66f667bb044f9c861346 (patch) | |
tree | 9940eb76056c652ad79834b7f567d9383e49c810 /modules/language/python | |
parent | dc9f37567dae95b4eedcb967fa1b2add3fad86c2 (diff) |
bisect module
Diffstat (limited to 'modules/language/python')
-rw-r--r-- | modules/language/python/compile.scm | 21 | ||||
-rw-r--r-- | modules/language/python/list.scm | 2 | ||||
-rw-r--r-- | modules/language/python/module/collections.scm | 107 | ||||
-rw-r--r-- | modules/language/python/string.scm | 8 |
4 files changed, 125 insertions, 13 deletions
diff --git a/modules/language/python/compile.scm b/modules/language/python/compile.scm index b00f304..f97597c 100644 --- a/modules/language/python/compile.scm +++ b/modules/language/python/compile.scm @@ -181,7 +181,16 @@ ((#:global . _) vs) - + + ((#:import (#:name ((ids ...) . as)) ...) + (let lp ((ids ids) (as as) (vs vs)) + (if (pair? as) + (lp (cdr ids) (cdr as) + (let ((as (car as)) + (ids (car ids))) + (union vs (list (exp '() (if as as (car ids))))))) + vs))) + ((#:expr-stmt l (#:assign u)) (union (fold (lambda (x s) (match x @@ -209,8 +218,16 @@ vs) ((#:class . _) vs) - ((#:global . _) + ((#:global . _) vs) + ((#:import (#:name ((ids ...) . as)) ...) + (let lp ((ids ids) (as as) (vs vs)) + (if (pair? as) + (lp (cdr ids) (cdr as) + (let ((as (car as)) + (ids (car ids))) + (union vs (list (exp '() (if as as (car ids))))))) + vs))) ((x . y) (defs y (defs x vs))) (_ vs))) diff --git a/modules/language/python/list.scm b/modules/language/python/list.scm index b101da7..782b5a9 100644 --- a/modules/language/python/list.scm +++ b/modules/language/python/list.scm @@ -753,7 +753,7 @@ (define-method (len x) (if (null? x) 0 - (error "not a suitable lengthof"))) + (error "not a suitable lengthof" x))) (define-method (len (v <vector>)) (vector-length v)) (define-method (len (s <string>)) (string-length s)) (define-method (len (o <py-list>)) (slot-ref o 'n)) diff --git a/modules/language/python/module/collections.scm b/modules/language/python/module/collections.scm index 9f40220..393877b 100644 --- a/modules/language/python/module/collections.scm +++ b/modules/language/python/module/collections.scm @@ -32,7 +32,7 @@ MappingView ItemsView KeysView ValuesView) #:export (OrderedDict ChainMap Counter UserDict UserString UserList - namedtuple defaultdict dequeue)) + namedtuple defaultdict deque)) #| * namedtuple factory function for creating tuple subclasses with named fields @@ -710,7 +710,7 @@ (raise KeyError (format #f "key ~a is missing" key)) (pylist-ref d key)))))) -(define-python-class dequeue () +(define-python-class deque () (define __init__ (lambda* (self #:optional (iterable '()) (maxlen None)) (let ((head (link))) @@ -941,15 +941,102 @@ (if (not (eq? p h)) (begin (yield (get-key p)) - (lp (get-prev p)))))))))))) + (lp (get-prev p))))))))))) + (define __contains__ + (lambda (self x) + (try + (lambda () + (if ((ref self 'index) x) + #t + #f)) + (#:except IndexError => + (lambda x #f))))) - - + (define __len__ + (lambda (self) + (ref self '_i))) + + (define __getitem__ + (lambda (self i) + (let ((n (ref self '_i))) + (if (or (>= i n) (< i 0)) + (raise IndexError i)) + (let lp ((p (get-next (ref self '_head))) (j 0)) + (if (= i j) + (get-key p) + (lp (get-next p) (+ j 1))))))) + + (define __setitem__ + (lambda (self i v) + (let ((n (ref self '_i))) + (if (or (>= i n) (< i 0)) + (raise IndexError i)) + (let lp ((p (get-next (ref self '_head))) (j 0)) + (if (= i j) + (set-key! p v) + (lp (get-next p) (+ j 1))))))) + + (define __delitem__ + (lambda (self i) + (let ((n (ref self '_i))) + (if (or (>= i n) (< i 0)) + (raise IndexError i)) + (let lp ((p (get-next (ref self '_head))) (j 0)) + (if (= i j) + (let ((prev (get-prev p)) + (next (get-next p))) + (set-next! prev next) + (set-prev! next prev) + (set self '_i (- n 1))) + (lp (get-next p) (+ j 1))))))) - - - - - + (define __repr__ + (lambda (self) + (let ((l (to-list self))) + (if (pair? l) + (format #f "deque([~a~{, ~a~}])" (car l) (cdr l)) + "deque([])")))) + + (define __add__ + (lambda (self iter) + (let ((o ((ref self 'copy)))) + (let ((f (ref o 'append))) + (for ((x : iter)) () + (f x))) + o))) + + (define __iadd__ + (lambda (self iter) + (let ((o self)) + (let ((f (ref o 'append))) + (for ((x : iter)) () + (f x))) + o))) + + (define __mul__ + (lambda (self n) + (let ((o (dequeue))) + (let ((f (ref o 'append))) + (let lp ((i 0)) + (if (< i n) + (begin + (for ((x : self)) () + (f x)) + (lp (+ i 1))) + o)))))) + + (define __imul__ + (lambda (self n) + (if (= n 0) + ((ref self 'clear)) + (let ((o self)) + (let ((f (ref o 'append))) + (let lp ((i 1)) + (if (< i n) + (begin + (for ((x : self)) () + (f x)) + (lp (+ i 1))) + o)))))))) diff --git a/modules/language/python/string.scm b/modules/language/python/string.scm index 91a78db..9563ad0 100644 --- a/modules/language/python/string.scm +++ b/modules/language/python/string.scm @@ -47,6 +47,14 @@ (apply it l) (next-method))))) +(define-syntax-rule (define-py0 (f o . u) code ...) + (begin + (define-method (f (o <string>) . u) code ...) + (define-method (f (o <py-string>) . l) (apply f (slot-ref o 'str) l)))) + +(define-py0 (pylist-ref s i) + (list->string (list (string-ref s i)))) + (define-py (py-capitalize capitalize s) (let* ((n (len s)) (w (make-string n))) |