bytevecor improvements
authorStefan Israelsson Tampe <stefan.itampe@gmail.com>
Sun, 15 Oct 2017 19:24:44 +0000 (21:24 +0200)
committerStefan Israelsson Tampe <stefan.itampe@gmail.com>
Sun, 15 Oct 2017 19:24:44 +0000 (21:24 +0200)
modules/language/python/compile.scm
modules/language/python/str.scm

index ab9b8f6d2fb029ee16bc7e53806716b634fc5f28..50698c8bb0ab35cb09bfc3b18d896e841012d9c0 100644 (file)
@@ -3,6 +3,7 @@
   #:use-module (ice-9 control)
   #:use-module (oop pf-objects)
   #:use-module (oop goops)
   #:use-module (ice-9 control)
   #:use-module (oop pf-objects)
   #:use-module (oop goops)
+  #:use-module (rnrs bytevectors)
   #:use-module (language python dict)
   #:use-module (language python exceptions)
   #:use-module (language python yield)
   #:use-module (language python dict)
   #:use-module (language python exceptions)
   #:use-module (language python yield)
@@ -10,6 +11,7 @@
   #:use-module (language python try)
   #:use-module (language python list)
   #:use-module (language python string)
   #:use-module (language python try)
   #:use-module (language python list)
   #:use-module (language python string)
+  #:use-module (language python str)
   #:use-module (language python number)
   #:use-module (language python def)
   #:use-module (ice-9 pretty-print)
   #:use-module (language python number)
   #:use-module (language python def)
   #:use-module (ice-9 pretty-print)
 
 (define-syntax-rule (aif it p x y) (let ((it p)) (if it x y)))
 
 
 (define-syntax-rule (aif it p x y) (let ((it p)) (if it x y)))
 
-(define-inlinable (C  x) `(@@ (language python compile) ,x))
-(define-inlinable (N  x) `(@@ (language python number)  ,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 (E  x) `(@@ (language python exceptions) ,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 (Se x) `(@@ (language python set)     ,x))
-(define-inlinable (D  x) `(@@ (language python def)     ,x))
-(define-inlinable (Di x) `(@@ (language python dict)    ,x))
-(define-inlinable (O  x) `(@@ (oop pf-objects)          ,x))
-(define-inlinable (G  x) `(@  (guile)                   ,x))
-(define-inlinable (H  x) `(@  (language python hash)    ,x))
+(define-inlinable (C   x) `(@@ (language python compile) ,x))
+(define-inlinable (N   x) `(@@ (language python number)  ,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 (E   x) `(@@ (language python exceptions) ,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 (STR x) `(@@ (language python str)     ,x))
+(define-inlinable (Se  x) `(@@ (language python set)     ,x))
+(define-inlinable (D   x) `(@@ (language python def)     ,x))
+(define-inlinable (Di  x) `(@@ (language python dict)    ,x))
+(define-inlinable (O   x) `(@@ (oop pf-objects)          ,x))
+(define-inlinable (G   x) `(@  (guile)                   ,x))
+(define-inlinable (H   x) `(@  (language python hash)    ,x))
 
 (define s/d 'set!)
 
 
 (define s/d 'set!)
 
    '(values)))
  
  (#:string
    '(values)))
  
  (#:string
-  ((#:string p x)
-   (if (or (equal? p "r") (equal? p "R"))
-       `((@ (language python str) str) ,x)
-       x)))
+  ((_ l)
+   (string-join l "")))
 
 
+ (#:bytes
+  ((_ l)
+   (let* ((n (let lp ((l l) (s 0))
+               (if (pair? l)
+                   (lp (cdr l) (+ s (length (car l))))
+                   s)))
+          (b (make-bytevector n)))
+     (let lp ((l l) (i 0))
+       (if (pair? l)
+           (let lp2 ((u (car l)) (i i))
+             (if (pair? u)
+                 (begin
+                   (bytevector-u8-set! b i (car u))
+                   (lp2 (cdr u) (+ i 1)))
+                 (lp (cdr l) i)))))
+     `(,(STR 'str) ,b))))
+           
+     
  (#:+
   ((_ . l)
    (cons '+ (map (g vs exp) l))))
  (#:+
   ((_ . l)
    (cons '+ (map (g vs exp) l))))
index e4e821b6b3dbb0438133e90cad84c337345afbdc..ef09def91e332a7091c2849215646e849c155486 100644 (file)
@@ -71,7 +71,8 @@
     (define-method (f (o <py-str>)     . l) (apply f (slot-ref o 'str) l))))
 
 (define-method (write (b <py-str>) . l)
     (define-method (f (o <py-str>)     . l) (apply f (slot-ref o 'str) l))))
 
 (define-method (write (b <py-str>) . l)
-  (apply write (b->string (slot-ref b 'str)) l))
+  (define port (if (pair? l) (car l) #t))
+  (format port "b~s" (b->string (slot-ref b 'str))))
 
 (define dynlink (dynamic-link))
 
 
 (define dynlink (dynamic-link))