progressively imporoving the conformance with python3
[software/python-on-guile.git] / modules / language / python / module / python.scm
index 99db1c21712a75ecb0c295a78a9748d00e0ce1a1..ef42cc6a63ec00612376a2574c8773ac80e66b48 100644 (file)
@@ -8,6 +8,7 @@
                     object-method))
   #:use-module (language python exceptions       )
   #:use-module ((language python module string   ) #:select ())
+  #:use-module ((language python module io       ) #:select (open))
   #:use-module (language python def              )
   #:use-module (language python for              )
   #:use-module (language python try              )
@@ -28,7 +29,7 @@
   #:use-module (language python eval             )
   #:use-module (language python bool             )
 
-  #:replace (list abs min max hash round format)
+  #:replace (list abs min max hash round format map)
   
   #:re-export (StopIteration GeneratorExit RuntimeError
                              Exception ValueError TypeError
                              SyntaxError bool
                              len dir next dict None property range
                              tuple bytes bytearray eval locals globals
-                             compile exec type object
+                             compile exec type object open
                              )
   
   #:export (print repr complex float int str
                   set all any bin callable reversed
                   chr classmethod staticmethod objectmethod
-                  divmod enumerate filter open
+                  divmod enumerate filter
                   getattr hasattr setattr hex isinstance issubclass
-                  iter map sum id input oct ord pow super
+                  iter sum id input oct ord pow super
                   sorted zip
                  ClassMethod StaticMethod Funcobj))
 
 (define-syntax-rule (aif it p x y) (let ((it p)) (if it x y)))
 
-(define (path-it path)
-  (aif it (ref path '__fspath__)
-       (it)
-       path))
-
 (define print
   (case-lambda
     (()  ((@ (guile) format) #t "~%"))
   (let ((r (ref a (symbol->string b) miss)))
     (not (eq? r miss))))
 
+(define-method (issubclass x y) #f)
 (define-method (issubclass (sub <p>) (cls <p>))
   (aif it (ref cls '__subclasscheck__)
        (it cls sub)
           #t
           (is-a? (ref sub '__goops__) (ref cls '__goops__)))))
 
+(define-method (isinstance x y)
+  (if (null? y)
+      #f
+      (if (pair? y)
+         (or (isinstance x (car y))
+             (isinstance x (cdr y)))
+         (is-a? x y))))
+
+(define-method (isinstance (i <integer>) y)
+  (if (issubclass y int)
+      #t
+      (if (pair? y)
+         (or (isinstance i (car y))
+             (isinstance i (cdr y)))
+         (is-a? i y))))
+
+(define-method (isinstance (i <real>) y)
+  (if (issubclass y float)
+      #t
+      (if (pair? y)
+         (or (isinstance i (car y))
+             (isinstance i (cdr y)))
+         (is-a? i y))))
+
+(define-method (isinstance (i <pair>) y)
+  (if (issubclass y tuple)
+      #t
+      (if (pair? y)
+         (or (isinstance i (car y))
+             (isinstance i (cdr y)))
+         (is-a? i y))))
+
+(define-method (isinstance (i <string>) y)
+  (if (issubclass y str)
+      #t
+      (if (pair? y)
+         (or (isinstance i (car y))
+             (isinstance i (cdr y)))
+         (is-a? i y))))
+
+(define-method (isinstance (i <bytevector>) y)
+  (if (issubclass y bytes)
+      #t
+      (if (pair? y)
+         (or (isinstance i (car y))
+             (isinstance i (cdr y)))
+         (is-a? i y))))
+
+
+(define-method (isinstance o (cl <p>))
+  (cond
+   ((eq? cl py-list)
+    (is-a? o <py-list>))
+   (else #f)))
+  
 (define-method (isinstance (o <p>) (cl <p>))
-  (aif it (ref cl '__instancecheck__)
-       (it o)
-       (if (pair? cl)
-           (or
-            (isinstance o (car cl))
-            (isinstance o (cdr cl)))
-           (is-a? o (ref cl '__goops__)))))
+  (cond
+   ((ref cl '__instancecheck__) =>
+    (lambda (it)
+      (it o)))
+   ((pair? cl)
+    (or
+     (isinstance o (car cl))
+     (isinstance o (cdr cl))))
+   (else
+    (is-a? o (ref cl '__goops__)))))
+              
+              
 
 (define iter
   (case-lambda
 (define (id x) (object-address x))
 
 (define (input str)
-  (format #t str)
+  ((@ (guile) format) #t str)
   (readline))
 
 (define (idx x) x)
                   (yield (reverse r))
                   (lp))))))))))
 
-(define DEFAULT_BUFFER_SIZE 4096)
-(def (open path
-           (= mode      "r")
-           (= buffering -1 )
-           (= encoding   None)
-           (= errors     None)
-           (= newline    None)
-           (= closefd    #t)
-           (= opener     None))
-     
-     (define modelist (string->list mode))
-     (define path     (path-it path))
-     (define (clean ch l)
-       (filter (lambda (c) (not (eq? ch c))) l))
-     (let ((port (if (number? path)
-                     (begin
-                       (if (member #\a modelist)
-                           (seek path 0 SEEK_END))
-                       (if (member #\x modelist)
-                           (error "cannot use mode 'x' for fd input"))
-                       (cond
-                        ((member #\r modelist)
-                         (fdes->inport path))
-                        ((member #\w modelist)
-                         (fdes->outport path))))
-                     (begin
-                       (if (member #\x modelist)
-                           (if (file-exists? path)
-                               (raise OSError "mode='x' and file exists")
-                               (set mode (list->string
-                                          (clean #\x modelist)))))                                                            
-                       ((@ (guile) open-file) (path-it path) mode)))))
-
-       (case buffering
-         ((-1)
-          (setvbuf port 'block DEFAULT_BUFFER_SIZE))
-         ((0)
-          (setvbuf port 'none))
-         ((1)
-          (setvbuf port 'line))
-         (else
-          (setvbuf port 'block buffering)))
-
-       port))
-
-
 (define-python-class ClassMethod  ())
 (define-python-class StaticMethod ())
 (define-python-class Funcobj      ())