summaryrefslogtreecommitdiff
path: root/modules/language/python/spec.scm
diff options
context:
space:
mode:
Diffstat (limited to 'modules/language/python/spec.scm')
-rw-r--r--modules/language/python/spec.scm48
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)))