eval
authorStefan Israelsson Tampe <stefan.itampe@gmail.com>
Tue, 17 Oct 2017 17:43:42 +0000 (19:43 +0200)
committerStefan Israelsson Tampe <stefan.itampe@gmail.com>
Tue, 17 Oct 2017 17:43:42 +0000 (19:43 +0200)
modules/language/python/eval.scm [new file with mode: 0644]
modules/language/python/exceptions.scm
modules/language/python/module/python.scm

diff --git a/modules/language/python/eval.scm b/modules/language/python/eval.scm
new file mode 100644 (file)
index 0000000..999acc0
--- /dev/null
@@ -0,0 +1,85 @@
+(define-module (language python eval)
+  #:use-module 
+  #:use-module (parser stis-parser lang python3-parser)
+  #:use-module (language python exceptions)
+  #:use-module ((ice-9 local-eval) #:select ((the-environment . locals)))
+  #:re-export (locals)
+  #:replace (eval)
+  #:export (local-eval local-compile globals compile exec))
+
+(define seval (@ (guile) eval))
+
+(define-syntax-rule (aif it p x y) (let ((it p)) (if it x y)))
+
+(define-syntax-rule (L x) (@@ (ice-9 local-eval) x))
+
+(define-syntax globals
+  (lambda (x)
+    (syntax-case x ()
+      ((g)
+       #'((L env-module) (locals g))))))
+
+(define* (local-eval x locals globals)
+  "Evaluate the expression @var{x} within the local environment @var{local} and
+global environment @var{global}."
+  (if locals
+      (if globals
+          (apply (seval ((L local-wrap) x locals) globals)
+                 ((L env-boxes) locals))
+          (apply (seval ((L local-wrap) x locals) ((L env-module) locals))
+                 ((L env-boxes) locals)))
+      (seval x (current-module))))
+
+(define* (local-compile x locals globals #:key (opts '()))
+  "Compile the expression @var{x} within the local environment @var{local} and
+global environment @var{global}."
+  (if locals
+      (if globals
+          (apply ((@ (system base compile) compile)
+                  ((L local-wrap) x locals) #:env globals
+                          #:from 'scheme #:opts opts)
+                 ((L env-boxes) locals))
+          (apply ((@ (system base compile) compile) ((L local-wrap) x locals)
+                          #:env ((L env-module) locals)
+                          #:from 'scheme #:opts opts)
+                 ((L env-boxes) locals)))
+      ((@ (system base compile) compile) x #:env (current-module)
+               #:from 'scheme #:opts opts)))
+
+(define-syntax eval 
+  (lambda (x)
+    (syntax-case x ()
+      ((eval x)
+       #'(eval0 x (locals eval)))
+      ((eval x . l)
+       #'(eval0 x . l)))))
+
+(define* (eval0 x #:optional (locals #f) (globals #f))
+  (cond
+   ((string? x)
+    (aif xp (p x)
+         (aif cp (comp xp)
+              (local-eval cp locals globals)
+              (raise SyntaxError))
+         (raise SyntaxError)))
+   ((pair? x)
+    (local-eval x locals globals))))
+
+(define* (compile x filename mode
+                  #:optional (flags 0) (dont_inherit #f) (optiomize -1))
+  (aif xp (p x)
+       (aif cp (comp xp)
+            cp
+            (raise SyntaxError))
+       (raise SyntaxError)))
+
+(define-syntax exec
+  (lambda (x)
+    (syntax-case x ()
+      ((exec x)
+       #'(eval0 x (locals exec)))
+      ((exec x . l)
+       #'(exec0 x . l)))))
+
+(define* (exec0 x #:optional (locals #f) (globals #f))
+  (local-eval x locals globals))
index 646a0a383939e89802a31fe263e486e195065f37..413abe1bd12361ae065b9afdaab62a99057e1209 100644 (file)
@@ -4,6 +4,7 @@
   #:export (StopIteration GeneratorExit RuntimeError
                           Exception ValueError TypeError
                           IndexError KeyError AttributeError
+                          SyntaxError
                           None))
 
 (define-syntax-rule (aif it p x y) (let ((it p)) (if it x y)))
@@ -17,6 +18,8 @@
 (define KeyError       'KeyError)
 (define TypeError      'TypeError)
 (define AttributeError 'AttributeError)
+(define SyntaxError    'SyntaxError)
+
 (define-python-class Exception ()
   (define __init__
     (case-lambda
index 7022ff1e16787e6b84d8b95ee0268d2c8a426bfd..296a30445c3aa11afe29f8b2f95a106354e01737 100644 (file)
   #:use-module (language python property         )
   #:use-module (language python range            )
   #:use-module (language python tuple            )
+  #:use-module (language python eval             )
 
   #:replace (list abs min max hash round)
   
   #:re-export (StopIteration GeneratorExit RuntimeError
-                          Exception ValueError TypeError
-                          IndexError KeyError AttributeError
-                         send sendException next
-                         GeneratorExit sendClose RuntimeError
-                         len dir next dict None property range
-                         tuple bytes bytearray                  
-                         )
+                             Exception ValueError TypeError
+                             IndexError KeyError AttributeError
+                             send sendException next
+                             GeneratorExit sendClose RuntimeError
+                             SyntaxError
+                             len dir next dict None property range
+                             tuple bytes bytearray eval locals globals
+                             compile exec
+                             )
   
   #:export (print repr complex float int
                   set all any bin callable reversed