simple python formatting now supported
authorStefan Israelsson Tampe <stefan.itampe@gmail.com>
Tue, 19 Sep 2017 21:34:25 +0000 (23:34 +0200)
committerStefan Israelsson Tampe <stefan.itampe@gmail.com>
Tue, 19 Sep 2017 21:34:25 +0000 (23:34 +0200)
modules/language/python/compile.scm
modules/language/python/list.scm

index 9076e61aefb793f8a392139d1de3f483af16173f..07a8e29911e6cef951e5044a4a7370734d3cc7bb 100644 (file)
@@ -8,6 +8,7 @@
   #:use-module (language python for)
   #:use-module (language python try)
   #:use-module (language python list)
+  #:use-module (language python string)
   #:use-module (ice-9 pretty-print)
   #:export (comp))
 
@@ -55,6 +56,7 @@
 (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 (S x) `(@@ (language python string)  ,x))
 (define-inlinable (O x) `(@@ (oop pf-objects)          ,x))
 (define-inlinable (G x) `(@  (guile)                   ,x))
 
     ((remove)  (L 'pylist-remove!))
     ((reverse) (L 'pylist-reverse!))
     ((sort)    (L 'pylist-sort!))
+
+    ;; String
+    ((format)  (S 'py-format))
     (else #f)))
 
+(define (get-kwarg vs arg)
+  (let lp ((arg arg) (l '()) (kw '()))
+    (match arg
+      (((#:= a b) . arg)
+       (lp arg
+           l
+           (cons*
+            (exp vs b)
+            (symbol->keyword
+             (exp vs a))
+            kw)))
+      ((x . arg)
+       (lp arg (cons (exp vs x) l) kw))
+      (()
+       (values (reverse l) (reverse kw))))))
+        
 (define (get-addings vs x)
   (match x
     (() '())
                  is-fkn?
                  `(#:identifier ',tag))))
           
-          ((#:arglist args apply  #f)
-           (if apply
-               `(#:apply ,@(map (g vs exp) args)
-                         ,`(,(L 'to-list) ,(exp vs apply)))
-               `(#:call  ,@(map (g vs exp) args))))
-        
+          ((#:arglist args apply #f)
+           (call-with-values (lambda () (get-kwarg vs args))
+             (lambda (args kwarg)
+               (if apply
+                   `(#:apply ,@args ,@kwarg
+                             ,`(,(L 'to-list) ,(exp vs apply)))
+                   `(#:call ,@args ,@kwarg)))))
+          
           ((#:subscripts (n #f #f))
            `(#:vecref ,(exp vs n)))
         
                       trailer)))
                
                ((#:arglist args apply  #f)
-                (if apply
-                    (lp `(apply ,e
-                                ,@(map (g vs exp) args)
-                                ,`(,(L 'to-list) ,(exp vs apply)))
-                        trailer)
-                    (lp `(,e ,@(map (g vs exp) args)) trailer)))
+                (call-with-values (lambda () (get-kwarg vs args))
+                  (lambda (args kwarg)
+                    (if apply
+                        (lp `(apply ,e 
+                                    ,@args
+                                    ,@kwarg
+                                    ,`(,(L 'to-list) ,(exp vs apply)))
+                            trailer)
+                        (lp `(,e ,@args ,@kwarg) trailer)))))
                
                ((#:subscripts (n #f #f))
                 `(,(L 'pylist-ref) ,e ,(exp vs n)))
index f31fcba073cfa4672f09952c8545266f44d0ae7a..3b7fbd5a39eca322064c83b23d7534cc282f5f87 100644 (file)
@@ -65,6 +65,9 @@
 (define-method (to-pylist (l <vector>))
   (to-pylist (vector->list l)))
 
+(define-method (to-pylist (o <string>))
+  (to-pylist (string->list o)))
+
 (define-method (to-pylist l)
   (if (null? l)
       (let ((o (make <py-list>)))
                      '()))))
     (to-pylist l)))
 
-(define-method (pylist-slice o n1 n2 n3)
-  (pylist-slice (to-pylist o) n1 n2 n3))
+(define-method (pylist-slice (o <string>) n1 n2 n3)
+  (list->string
+   (to-list
+    (pylist-slice (to-pylist o) n1 n2 n3))))
+
+(define-method (pylist-slice (o <pair>) n1 n2 n3)
+  (to-list
+   (pylist-slice (to-pylist o) n1 n2 n3)))
+
+(define-method (pylist-slice (o <vector>) n1 n2 n3)
+  (list->vector
+   (to-list
+    (pylist-slice (to-pylist o) n1 n2 n3))))
 
 ;;SUBSET
 (define-method (pylist-subset! (o <py-list>) n1 n2 n3 val)