diff options
Diffstat (limited to 'modules/language/python/spec.scm')
-rw-r--r-- | modules/language/python/spec.scm | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/modules/language/python/spec.scm b/modules/language/python/spec.scm new file mode 100644 index 0000000..1389165 --- /dev/null +++ b/modules/language/python/spec.scm @@ -0,0 +1,48 @@ +(define-module (language python spec) + #:use-module (language python parser) + #:use-module (language python compile) + #:use-module (rnrs io ports) + #:use-module (ice-9 pretty-print) + #: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) (pretty-print x) (car (reverse x))) + +(define (c x) (pr (comp (pr (p (pr x)))))) +(define (cc port x) + (if (equal? x "") (read port) (c x))) + +(define-language python + #:title "python" + #:reader (lambda (port env) + (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))) |