diff options
Diffstat (limited to 'modules/language/python/eval.scm')
-rw-r--r-- | modules/language/python/eval.scm | 86 |
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 |