(define-module (language python spec) #:use-module (parser stis-parser lang python3-parser) #: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)) ;;; ;;; Language definition ;;; (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) (car (reverse x))) (define (c x) (pr (comp (pr (p (pr x)))))) (define (cc port x) (if (equal? x "") (read port) (c x))) (define (e x) (eval (c x) (current-module))) (set! (@@ (ice-9 readline) *readline-completion-function*) (complete-fkn e)) (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)))) #: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)))