remove warnings, reordering
[software/python-on-guile.git] / modules / language / python / spec.scm
index 1389165094528cb733aeddeef03467251aba52ef..4b05cbf46978afc6db8849587ae2b49b19b26f06 100644 (file)
@@ -1,48 +1,97 @@
 (define-module (language python spec)
-  #:use-module (language python parser)
+  #:use-module (language python guilemod)
+  #:use-module (parser stis-parser lang python3-parser)
+  #:use-module ((language python module python) #:select ())
   #:use-module (language python compile)
+  #:use-module (language python completer)
   #:use-module (rnrs io ports)
   #:use-module (ice-9 pretty-print)
+  #:use-module (ice-9 readline)
   #:use-module (system base compile)
   #:use-module (system base language)
   #: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 (pr . x) (pretty-print x) (car (reverse  x)))
+(define dolog #f)
+(define (pr . x)
+  (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 (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 ()
+    (set! (@@ (ice-9 readline) *readline-completion-function*)
+      (complete-fkn e)))
+  (lambda x #f))
 
 (define-language python
   #:title      "python"
-  #:reader      (lambda (port env)
-                  (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))
   #:printer    write
   #:make-default-environment
-                (lambda ()
-                  ;; Ideally we'd duplicate the whole module hierarchy so that `set!',
-                  ;; `fluid-set!', etc. don't have any effect in the current environment.
-                  (let ((m (make-fresh-user-module)))
-                    ;; Provide a separate `current-reader' fluid so that
-                    ;; compile-time changes to `current-reader' are
-                    ;; limited to the current compilation unit.
-                    (module-define! m 'current-reader (make-fluid))
-
-                    ;; Default to `simple-format', as is the case until
-                    ;; (ice-9 format) is loaded.  This allows
-                    ;; compile-time warnings to be emitted when using
-                    ;; unsupported options.
-                    (module-set! m 'format simple-format)
-                    
-                    m)))
+  (lambda ()
+    ;; Ideally we'd duplicate the whole module hierarchy so that `set!',
+    ;; `fluid-set!', etc. don't have any effect in the current environment.
+    (let ((m (make-fresh-user-module)))                    
+      ;; Provide a separate `current-reader' fluid so that
+      ;; compile-time changes to `current-reader' are
+      ;; limited to the current compilation unit.
+      (module-define! m 'current-reader (make-fluid))
+      
+      ;; Default to `simple-format', as is the case until
+      ;; (ice-9 format) is loaded.  This allows
+      ;; compile-time warnings to be emitted when using
+      ;; unsupported options.
+      (module-set! m 'format simple-format)
+      
+      m)))