diff options
Diffstat (limited to 'modules/language/python/module.scm')
-rw-r--r-- | modules/language/python/module.scm | 62 |
1 files changed, 60 insertions, 2 deletions
diff --git a/modules/language/python/module.scm b/modules/language/python/module.scm index 5cefeba..adc87fd 100644 --- a/modules/language/python/module.scm +++ b/modules/language/python/module.scm @@ -39,6 +39,11 @@ (rawref self '_module) (rawref self '_export)))) +(define (globals self) + (aif it (rawref self '_export) + it + (rawref self '_module))) + (define-python-class Module () (define _modules (make-hash-table)) (define __setprivate__ @@ -88,7 +93,7 @@ '(language python module))) (__init__ self (reverse '(language python module)) (cdddr l) '()) - (__init__ self '() l '())) + (__init__ self '() (reverse l) '())) (__init__ self (append '(language python module) @@ -172,6 +177,47 @@ (lambda x (fail))) (fail)))))) + (define __global_setitem__ + (lambda (self k v) + (let ((k (_k k)) + (fail (lambda () (raise KeyError "setattr in Module" k)))) + (aif m (rawref self '_module) + (catch #t + (lambda () + (if (module-defined? m k) + (module-set! m k v) + (begin + (module-define! m k v) + (module-export! m (list k))))) + (lambda x (fail))) + (fail))))) + + (define __global_getitem__ + (lambda (self k) + (let ((k (_k k)) + (fail (lambda () (raise KeyError "global setattr in Module" k)))) + (aif m (rawref self '_export) + (catch #t + (lambda () + (if (module-defined? m k) + (module-ref m k) + (fail))) + (lambda x (fail))) + (fail))))) + + (define __global_get__ + (lambda (self k . es) + (let ((k (_k k)) + (fail (lambda () (raise KeyError "global setattr in Module" k)))) + (aif m (rawref self '_export) + (catch #t + (lambda () + (if (module-defined? m k) + (module-ref m k) + (if (pair? es) (car es) #f))) + (lambda x (fail))) + (fail))))) + (define __delattr__ (lambda (self k) (define (fail) (raise KeyError "delattr in Module")) @@ -209,7 +255,19 @@ (module-for-each add m) (module-for-each add (rawref self '_export)) l))) - + + (define __global_iter__ + (lambda (self) + (let* ((m (globals self)) + (l '()) + (add (lambda (k v) + (let ((k (symbol->string k))) + (if (and (not (in "-" k)) (variable-bound? v)) + (set! l (cons (list k (variable-ref v)) + l))))))) + (module-for-each add m) + l))) + (define __repr__ |