bisect module
authorStefan Israelsson Tampe <stefan.itampe@gmail.com>
Thu, 22 Mar 2018 09:40:03 +0000 (10:40 +0100)
committerStefan Israelsson Tampe <stefan.itampe@gmail.com>
Thu, 22 Mar 2018 09:40:03 +0000 (10:40 +0100)
modules/language/python/compile.scm
modules/language/python/list.scm
modules/language/python/module/collections.scm
modules/language/python/string.scm
modules/oop/pf-objects.scm

index b00f304e254991bba734e1cba027debe04a35f69..f97597ca8111c1288b2c9753695f0c9b50689a9d 100644 (file)
 
     ((#: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
      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)))
index b101da73e597a16f5454cbd329ea57690dfd7d7a..782b5a9d8fbf49057321df33a43a7496b22646b2 100644 (file)
 (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))
index 9f402204a4c5430888890ecf7c094381385c2548..393877bb9d4d98d66386083c5ad2e446a4c3cdd8 100644 (file)
@@ -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
            (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)))
                 (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))))))))
index 91a78dbe399a245e4dcef079ac21aa76293050cc..9563ad03ae187f085e6b17b6d4e7c9a6ce2fbdfa 100644 (file)
            (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)))
index 0418a5f72b18fa29e3dc35e52c8a08df01afcb21..5de0168ef52d3e9b03b5a9747ed3895675e9d4db 100644 (file)
@@ -303,7 +303,9 @@ explicitly tell it to not update etc.
        (if (or (not f) (eq? f not-implemented))
           (mrefx xx key l)
           (catch #t
-                 (lambda () ((f xx (fluid-ref *refkind*)) key))
+                 (lambda ()
+                   (make-variable
+                    ((f xx (fluid-ref *refkind*)) key)))
                  (lambda x
                    (mrefx xx key l))))))))
 
@@ -318,9 +320,11 @@ explicitly tell it to not update etc.
 (define-syntax-rule (mref-py x key l)
   (let ((xx x))
     (let ((res (mrefx-py xx key l)))
-      (if (and (not (struct? res)) (procedure? res))
-         (res xx (fluid-ref *refkind*))
-         res))))
+      (if (variable? res)
+         (variable-ref res)
+         (if (and (not (struct? res)) (procedure? res))
+             (res xx (fluid-ref *refkind*))
+             res)))))
 
 (define-method (ref x key . l) (if (pair? l) (car l) #f))
 (define-method (ref (x <pf> )  key . l) (mref     x key l))