diff options
Diffstat (limited to 'modules/language/python/#spec.scm#')
-rw-r--r-- | modules/language/python/#spec.scm# | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/modules/language/python/#spec.scm# b/modules/language/python/#spec.scm# new file mode 100644 index 0000000..8291a14 --- /dev/null +++ b/modules/language/python/#spec.scm# @@ -0,0 +1,68 @@ +(define-module (language python spec) + #: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)) + +;;; +;;; 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))) + +(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) + (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))) |