_csv module is tested
authorStefan Israelsson Tampe <stefan.itampe@gmail.com>
Fri, 24 Aug 2018 10:10:10 +0000 (12:10 +0200)
committerStefan Israelsson Tampe <stefan.itampe@gmail.com>
Fri, 24 Aug 2018 10:10:10 +0000 (12:10 +0200)
modules/language/python/compile.scm
modules/language/python/exceptions.scm
modules/language/python/module/_csv.scm

index 619ef1bdb4c02ab52ac70e86e6e2127dd12e3771..aec886bc821ee53414ceb101883b7886d09d8e5f 100644 (file)
     ((#:cfor for-e in-e cont)
      (let lp ((for-e for-e))
        (match for-e
-         (((#:power #f (#:tuple . l) . _))
-          (lp l))
+         (((#:sub l))
+          `(,(F 'for) ((,@(map (lambda (x) (gv ((g vs exp) x))) l)
+                       : ,(exp vs in-e))) ()
+                        ,(gen-sel vs cont item)))
          (_
           `(,(F 'for) ((,@(map (lambda (x) (gv ((g vs exp) x))) for-e)
                        : ,(exp vs in-e))) ()
 (define (export-all)
   (define mod (current-module))
   (if (module-defined? mod '__all__)
-      (module-export! mod
+      (begin
+        (module-export! mod
         (for ((x : (module-ref mod '__all__))) ((l '()))
-             (cons (string->symbol (scm-str x)) l)
-             #:final l))))
+             (let ((x (string->symbol (scm-str x))))
+               (if (module-locally-bound? mod x)
+                   (cons x l)
+                   l))
+               #:final l))
+        (module-re-export! mod
+          (for ((x : (module-ref mod '__all__))) ((l '()))
+               (let ((x (string->symbol (scm-str x))))
+                 (if (not (module-locally-bound? mod x))
+                     (cons x l)
+                     l))
+               #:final l)))))
   
 (define-syntax qset!
   (syntax-rules (cons quote)
index 9425feaebb1ce8242d155f06bb4f040fd324a812..bb2c73909238b94241ad7676fa93c344e7119283 100644 (file)
@@ -14,7 +14,7 @@
                          OverflowError RecursionError
                          Warning DeprecationWarning BytesWarning
                           UnicodeDecodeError LookupError IndentationError
-                          KeyboardInterrupt MemoryError))
+                          KeyboardInterrupt MemoryError NameError))
 
 (define-syntax-rule (aif it p x y) (let ((it p)) (if it x y)))
 
@@ -68,6 +68,7 @@
 (define GeneratorExit           'GeneratorExit)
 
 (define-er MemoryError          'MemoryError)
+(define-er NameError            'NameError)
 (define-er UnicodeDecodeError   'UnicodeDecodeError)
 (define-er LookupError          'LookupError)
 (define-er IndentationError     'IndentationError)
index 56e08da5dce0d94b79325414eaa13c73192352f9..5ac61599c63d17afbb83604ba4beec533eb50806 100644 (file)
@@ -10,7 +10,9 @@
   #:export (QUOTE_ALL QUOTE_MINIMAL QUOTE_NONNUMERIC QUOTE_NONE
                       reader writer Error field_size_limit
                       get_dialect register_dialect unregister_dialect
-                      list_dialects __doc__ Dialect))
+                      list_dialects __doc__ Dialect __version__))
+
+(define __version__ "1.0")
 
 (define-syntax-rule (aif it p . l) (let ((it p)) (if it . l)))
 
@@ -136,12 +138,15 @@ SETTINGS:
         a)))
 
 (define-syntax-rule (chr a b c)
-  (string-ref
-   (bif it a
-        it
-        (bif it b
-             it
-             c)) 0))
+  (let ((x
+         (bif it a
+              it
+              (bif it b
+                   it
+                   c))))
+    (if (string? x)
+        (string-ref x 0)
+        #f)))
 
 (define-syntax-rule (oor a b c)
     (bif it a
@@ -187,9 +192,9 @@ SETTINGS:
        (strict          (oor (py-get fmtparams "strict" e)
                              (ref    dialect   'strict  e)
                              #f)))
-    (make-generator ()
+    ((make-generator ()
      (lambda (yield)
-      (let/ec ret
+       (let/ec ret
        (let ((iter (wrap-in csvfile)))
          (let lp0 ((state 'start) (r '()) (l '()))
            (define-syntax-rule (raise- s) (if strict (raise s)))
@@ -205,10 +210,12 @@ SETTINGS:
                       (lambda x
                         (cond
                          ((or (eq? state 'line-end)
-                              (eq? state 'start)
-                              (eq? state 'field-end))
+                              (eq? state 'start))
                           (ret (reverse l)))
 
+                         ((eq? state 'field-end)
+                          (ret (reverse (cons (wrap1 r) l))))
+                         
                          ((or (eq? state 'numeric)
                               (eq? state 'normal))
                           (ret (reverse (cons (wrap1 r) l))))
@@ -217,8 +224,9 @@ SETTINGS:
                           (raise- (Error "missing quote"))
                           (ret (reverse (cons (wrap1 r) l)))))))))
                          
-             (let ((n (len s)))
-               (let lp ((i 0) (state state) (r '()) (l l))
+             (let* ((n (len s))
+                    (? (= n 1)))               
+               (let lp ((i 0) (state state) (r r) (l l))
                  (mk-wrap wrap state)
                  (define-syntax-rule (raise- s)
                    (if strict
@@ -227,12 +235,34 @@ SETTINGS:
 
                  (define (end j ch)
                    (if (eq? ch #\newline)
-                       (if (eq? state 'start)
+                       (cond
+                        ((eq? state 'start)
+                         (begin
+                           (yield (py-list (reverse l)))
+                           (if (= n j)
+                               (lp0 'start '() '())
+                               (lp (+ j 1) 'line-end '() '()))))
+                         
+                        ((eq? state 'quote)
+                         (if strict
+                             (raise (Error "newline in quote"))
+                             (lp j 'normal r l)))
+                        
+                        ((eq? state 'line-end)
+                         (if (= n j)
+                             (lp0 'start r l)
+                             (lp (+ j 1) state r l)))
+                        
+                        (else
+                         (yield (reverse (cons (wrap r) l)))
+                         (if (= n j)
+                             (lp0 'start '() '())
+                             (lp (+ j 1) 'line-end '() '()))))
+                       (if (= j n)
                            (begin
-                             (yield (py-list (reverse l)))
-                             (lp (+ j 1) 'line-end '() '()))
-                           (lp (+ j 1) state r l))
-                       (lp (+ j 1) 'start '() (cons (wrap r) l))))
+                             (yield (reverse (cons* "" (wrap r) l)))
+                             (lp0 'start '() '()))
+                           (lp (+ j 1) 'start '() (cons (wrap r) l)))))
                      
                  (define (do-quotechar ch)
                    (cond
@@ -347,6 +377,9 @@ SETTINGS:
                     ((eq? state 'normal)
                      (end i ch))
 
+                    ((eq? state 'doublequote)
+                     (lp (+ i 1) 'start '() (cons (wrap r) l)))
+                    
                     ((eq? state 'numeric)
                      (end i ch))))
 
@@ -366,7 +399,6 @@ SETTINGS:
 
                     (else
                      (end i #\newline))))
-                            
                  (if (< i n)
                      (let ((ch (string-ref s i)))
                        (cond
@@ -427,7 +459,9 @@ SETTINGS:
                         
                         (else
                          (error "Bug in csv reader"))))
-                     (lp0 state r l))))))))))))
+                     (if ?
+                         (lp0 state r l)
+                         (end i #\newline))))))))))))))
               
 (define-python-class writer ()                                 
   (define __init__
@@ -528,7 +562,9 @@ SETTINGS:
                      ((eq? a quotechar)
                       (if doublequote
                           (lp (+ i 1) (cons* a a r))
-                          (lp (+ i 1) (cons* a escapechar r))))
+                          (if escapechar
+                              (lp (+ i 1) (cons* a escapechar r))
+                              (raise (Error "no escapechar defined")))))
                      ((eq? a escapechar)
                       (lp (+ i 1) (cons* a a r)))
                      (else