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