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.scm123
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)))))))))))