remove warnings, reordering
[software/python-on-guile.git] / modules / language / python / spec.scm
index 8291a144556f560b173bb072cd340b298975f235..4b05cbf46978afc6db8849587ae2b49b19b26f06 100644 (file)
   #:use-module (language scheme compile-tree-il)
   #:use-module (language scheme decompile-tree-il)
   #:use-module (ice-9 rdelim)
-  #:export (python))
+  #:export (python dolog))
 
 ;;;
 ;;; Language definition
 ;;;
 
+(define dolog #f)
 (define (pr . x)
-  (define port (open-file "/home/stis/src/python-on-guile/log.txt" "a"))
-  (with-output-to-port port
-    (lambda ()
-      (pretty-print x) (car (reverse  x))))
-  (close port)
+  (when dolog
+    (define port (open-file "log.txt" "a"))
+    (with-output-to-port port
+      (lambda ()
+        (pretty-print x) (car (reverse  x))))
+    (close port))
   (car (reverse x)))
 
-(define (c x) (pr (comp (pr (p (pr x))))))
-(define (cc port x)
-  (if (equal? x "") (read port) (c x)))
+(define (c int x) (pr (comp int (pr (p (pr x))))))
+(define (cc int port x)
+  (if (equal? x "") (read port) (c int x)))
+
+(define (e x) (eval (c #t x) (current-module)))
 
-(define (e x) (eval (c x) (current-module)))
+
+(define (int)
+  (catch #t
+    (lambda ()
+      (if (fluid-ref (@@ (system base compile) %in-compile))
+          #f
+          #t))
+    (lambda x #f)))
+
+(define (in)
+  (catch #t
+    (lambda ()
+      (fluid-set! (@@ (system base compile) %in-compile) #t))
+    (lambda x #f)))
+
+(define mapper (make-weak-key-hash-table))
+
+(define python-reader-wrap
+  (lambda (port env)
+    (if (int)
+        (cc #t port (read-line port))
+        (let lp ((port2 (hash-ref mapper port)))
+          (if port2
+              (read port2)
+              (let ((port2
+                     (open-input-string (cc #f port (read-string port)))))
+                (use-modules (language python guilemod))
+                (in)
+                (hash-set! mapper port port2)
+                (lp port2)))))))
 
 (catch #t
   (lambda ()
 
 (define-language python
   #:title      "python"
-  #:reader      (lambda (port env)
-                  (if (not (fluid-ref (@@ (system base compile) %in-compile)))
-                      (cc port (read-line port))
-                      (cc port (read-string port))))
-
+  #:reader      python-reader-wrap
   #:compilers   `((tree-il . ,compile-tree-il))
   #:decompilers `((tree-il . ,decompile-tree-il))
   #:evaluator  (lambda (x module) (primitive-eval x))