summaryrefslogtreecommitdiff
path: root/modules/language/python/eval.scm
diff options
context:
space:
mode:
Diffstat (limited to 'modules/language/python/eval.scm')
-rw-r--r--modules/language/python/eval.scm86
1 files changed, 76 insertions, 10 deletions
diff --git a/modules/language/python/eval.scm b/modules/language/python/eval.scm
index a54ea64..1cdb459 100644
--- a/modules/language/python/eval.scm
+++ b/modules/language/python/eval.scm
@@ -1,6 +1,12 @@
(define-module (language python eval)
#:use-module (parser stis-parser lang python3-parser)
#:use-module (language python exceptions)
+ #:use-module (language python module)
+ #:use-module (language python try)
+ #:use-module (language python list)
+ #:use-module (language python for)
+ #:use-module (language python dict)
+ #:use-module (oop pf-objects)
#:use-module ((ice-9 local-eval) #:select ((the-environment . locals)))
#:re-export (locals)
#:replace (eval)
@@ -12,22 +18,82 @@
(define-syntax-rule (L x) (@@ (ice-9 local-eval) x))
-(define MM (list 'error))
-(define (M mod)
- (let ((l '()))
- (module-for-each
- (lambda (k v)
- (if (not (eq? (variable-ref v) MM))
- (set! l (cons (symbol->string k) l))))
- mod)
- l))
-
(define-syntax globals
(lambda (x)
(syntax-case x ()
((g)
#'(M ((L env-module) (locals g)))))))
+(define-syntax-rule (call- self item a ...)
+ (let ((class (ref self '_module)))
+ ((rawref class item) class a ...)))
+
+(define-syntax-rule (apply- self item a ...)
+ (let ((class (ref self '_module)))
+ (apply (rawref class item) class a ...)))
+
+(define-syntax-rule (ref- self item)
+ (let ((class (ref self '_module)))
+ (rawref class item)))
+
+
+(define-python-class GlobalModuleWrap (dict)
+ (define __init__
+ (lambda (self module)
+ (set self '_module module)))
+
+ (define __getitem__
+ (lambda (self key)
+ (if (string? key) (set! key (string->symbol key)))
+ (call- self '__global_getitem__ key)))
+
+ (define get
+ (lambda (self key . es)
+ (if (string? key) (set! key (string->symbol key)))
+ (apply- self '__global_get__ key es)))
+
+ (define __setitem__
+ (lambda (self key val)
+ (if (string? key) (set! key (string->symbol key)))
+ (call- self '__global_setitem__ key val)))
+
+ (define __iter__
+ (lambda (self)
+ (call- self '__global_iter__)))
+
+ (define values
+ (lambda (self)
+ (for ((k v : (__iter__ self))) ((l '()))
+ (cons v l)
+ #:final l)))
+
+ (define keys
+ (lambda (self)
+ (for ((k v : (__iter__ self))) ((l '()))
+ (cons k l)
+ #:final l)))
+
+ (define items __iter__)
+
+ (define __repr__
+ (lambda (self)
+ (format #f "globals(~a)" (ref- self '__name__)))))
+
+
+
+(define MM (list 'error))
+(define (M mod)
+ (set! mod (module-name mod))
+ (if (and (> (length mod) 3)
+ (eq? (car mod) 'language)
+ (eq? (cadr mod) 'python)
+ (eq? (caddr mod) 'module))
+ (set! mod (Module (reverse mod)
+ (reverse (cdddr mod))))
+ (set! mod (Module (reverse mod) (reverse mod))))
+
+ (GlobalModuleWrap mod))
+
(define* (local-eval x locals globals)
"Evaluate the expression @var{x} within the local environment @var{local} and