From 1f86ca7767d661a42b3e66f667bb044f9c861346 Mon Sep 17 00:00:00 2001 From: Stefan Israelsson Tampe Date: Thu, 22 Mar 2018 10:40:03 +0100 Subject: bisect module --- modules/language/python/compile.scm | 21 ++++- modules/language/python/list.scm | 2 +- modules/language/python/module/collections.scm | 107 ++++++++++++++++++++++--- modules/language/python/string.scm | 8 ++ 4 files changed, 125 insertions(+), 13 deletions(-) (limited to 'modules/language/python') 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-length v)) (define-method (len (s )) (string-length s)) (define-method (len (o )) (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 ) . u) code ...) + (define-method (f (o ) . 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))) -- cgit v1.2.3