diff options
Diffstat (limited to 'modules/language/python/module.scm')
-rw-r--r-- | modules/language/python/module.scm | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/modules/language/python/module.scm b/modules/language/python/module.scm new file mode 100644 index 0000000..615d163 --- /dev/null +++ b/modules/language/python/module.scm @@ -0,0 +1,123 @@ +(define-module (language python module) + #:use-module (oop pf-objects) + #:use-module (ice-9 match) + #:use-module (language python exceptions) + #:use-module (language python yield) + #:use-module (language python try) + #:use-module (language python dir) + #:export (Module)) + +(define e (list 'e)) + +(define _k + (lambda (k) + (if (string? k) + (string->symbol k) + k))) + +(define _m + (lambda (self) + (if (rawref self '_private) + (rawref self '_module) + (rawref self '_export)))) + +(define-python-class Module () + (define __setprivate__ + (lambda (self p) + (set self '_isprivate p))) + + (define __init__ + (case-lambda + ((self pre l nm) + (match l + ((name) + (_make self (cons name pre) (cons name nm))) + ((name . (and l (name2 . _))) + (set self name2 (Module (cons name pre) l (cons name nm))) + (_make self (cons name pre) (cons name nm))))) + + ((self l) + (if (pair? l) + (if (and (> (length l) 3) + (equal? (list (list-ref l 0) + (list-ref l 1) + (list-ref l 2)) + '(language python module))) + (__init__ self (reverse '(language python module)) (cdddr l) '()) + (_make self l l)) + (__init__ self + (map string->symbol + (string-split l #\.))))))) + (define _make + (lambda (self l nm) + (begin + (set self '_private #f) + (set self '__dict__ self) + (set self '__name__ (string-join (map symbol->string (reverse nm)) ".")) + (let ((_module (resolve-module (reverse l)))) + (set self '_export (module-public-interface _module)) + (set self '_module _module))))) + + (define __getattribute__ + (lambda (self k . l) + (define (fail) + (if (pair? l) + (car l) + (raise KeyError "getattr in Module"))) + (if (rawref self '_module) + (let ((k (_k k)) + (m (_m self))) + (let ((x (module-ref m k e))) + (if (eq? e x) + (fail) + x))) + (fail)))) + + (define __setattr__ + (lambda (self k v) + (let ((k (_k k)) + (fail (lambda () (raise KeyError "getattr in Module")))) + (if (rawref self k) + (fail) + (if (rawref self '_module) + (let ((m (_m self))) + (catch #t + (lambda () + (if (module-defined? m k) + (module-set! m k v) + (module-define! m k v))) + (lambda x (pk 'fail x)))) + (fail)))))) + + (define __delattr__ + (lambda (self k) + (define (fail) (raise KeyError "getattr in Module")) + (if (rawref self '_module) + (let ((m (_m self)) + (k (_k k))) + (if (module-defined? m k) + (module-remove! m k) + (raise KeyError "delattr of missing key in Module"))) + (fail)))) + + (define __repr__ + (lambda (self) (ref self '__name__))) + + (define __getitem__ + (lambda (self k) + (define k (if (string? k) (string->symbol k) k)) + (__getattr__ self k))) + + (define __iter__ + (lambda (self) + (define m (_m self)) + ((make-generator () + (lambda (yield) + (define l '()) + (define (f k v) (set! l (cons (list (symbol->string k) v) l))) + (module-for-each f m) + (let lp ((l l)) + (if (pair? l) + (begin + (apply yield (car l)) + (lp (cdr l))))))))))) |