slices now working
authorStefan Israelsson Tampe <stefan.itampe@gmail.com>
Sat, 16 Sep 2017 21:45:01 +0000 (23:45 +0200)
committerStefan Israelsson Tampe <stefan.itampe@gmail.com>
Sat, 16 Sep 2017 21:45:01 +0000 (23:45 +0200)
modules/language/python/compile.scm
modules/language/python/list.scm

index 873b264dde252c951adcd7671b56c9a7089cb633..734fe6004d9124f9754b3983ad720e2eb116807f 100644 (file)
   x)
 
 (define-inlinable (C x) `(@@ (language python compile) ,x))
-(define-inlinable (Y x) `(@@ (language python yield) ,x))
-(define-inlinable (T x) `(@@ (language python try) ,x))
-(define-inlinable (F x) `(@@ (language python for) ,x))
-(define-inlinable (L x) `(@@ (language python list) ,x))
-(define-inlinable (O x) `(@@ (oop pf-objects) ,x))
-(define-inlinable (G x) `(@ (guile) ,x))
+(define-inlinable (Y x) `(@@ (language python yield)   ,x))
+(define-inlinable (T x) `(@@ (language python try)     ,x))
+(define-inlinable (F x) `(@@ (language python for)     ,x))
+(define-inlinable (L x) `(@@ (language python list)    ,x))
+(define-inlinable (A x) `(@@ (language python array)   ,x))
+(define-inlinable (O x) `(@@ (oop pf-objects)          ,x))
+(define-inlinable (G x) `(@  (guile)                   ,x))
 
 (define (union as vs)
   (let lp ((as as) (vs vs))
                         trailer)
                     (lp `(,e ,@(map (g vs exp) args)) trailer)))
                
+               ((#:subscripts (n #f #f))
+                `(,(L 'pylist-ref) ,e ,(exp vs n)))
+               
+               ((#:subscripts (n1 n2 n3))
+                (let ((w (lambda (x) (if (eq? x 'None) ''None x))))
+                  `(,(L 'pylist-slice) ,e
+                    ,(w (exp vs n1)) ,(w (exp vs n2)) ,(w (exp vs n3)))))
+
+               ((#:subscripts (n #f #f) ...)
+                `(,(A 'pyarray-ref) ,e (list ,@ (map (lambda (n)
+                                                       (exp vs n))
+                                                     n))))
+
+               ((#:subscripts (n1 n2 n3) ...)
+                (let ((w (lambda (x) (if (eq? x 'None) ''None x))))
+                  `(,(A 'pyarray-slice) ,e
+                    (list ,@(map (lambda (x y z)
+                                   `(list ,(exp vs x) ,(exp vs y) ,(exp vs z)))
+                                 n1 n2 n3)))))
+                 
                (_ (error "unhandled trailer")))))))))))
 
  (#:identifier
index 8f734d86261f6c63f034d5ad8821a02f52323fd5..0b98b61a6902e1a3ca7fb09df9b43a2d820b0b2a 100644 (file)
@@ -6,7 +6,8 @@
   #:use-module (language python for)
   #:use-module (language python try)
   #:use-module (language python exceptions)
-  #:export (to-list pylist-ref pylist-set! pylist-append!))
+  #:export (to-list pylist-ref pylist-set! pylist-append!
+                    pylist-slice))
 
 (define-syntax-rule (aif it p x y) (let ((it p)) (if it x y)))
 
     (slot-set! o 'vec vec)
     o))
 
+(define-method (to-pylist (l <vector>))
+  (to-pylist (vector->list l)))
 
+(define-method (to-pylist l)
+  (if (null? l)
+      (let ((o (make <py-list>)))
+        (slot-set! o 'vec (make-vector 4))
+        (slot-set! o 'n   0)
+        o)
+      (error "not able to make a pylist")))
+  
 ;;; REF
 (define-method (pylist-ref (o <py-list>) n)
   (if (< n (slot-ref o 'n))
 (define-method (pylist-set! (o <p>) n val)
   ((ref o '__listset__) n val))
 
+;;SLICE
+(define-method (pylist-slice (o <py-list>) n1 n2 n3)
+  (let* ((n1   (if (eq? n1 'None) 0                n1))
+         (n2   (if (eq? n2 'None) (slot-ref o 'n)  n2))
+         (n3   (if (eq? n3 'None) 1                n3))
+
+         (vec  (slot-ref o 'vec))
+         (l    (let lp ((i n1))
+                 (if (< i n2)
+                     (cons (vector-ref vec i) (lp (+ i n3)))
+                     '()))))
+    (to-pylist l)))
+
+(define-method (pylist-slice o n1 n2 n3)
+  (pylist-slice (to-pylist o) n1 n2 n3))
+
 ;;APPEND
 (define-method (pylist-append! (o <py-list>) val)
   (let* ((n   (slot-ref o 'n))