diff options
Diffstat (limited to 'modules/language/python/module.scm')
-rw-r--r-- | modules/language/python/module.scm | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/modules/language/python/module.scm b/modules/language/python/module.scm index ab963d1..5c5d630 100644 --- a/modules/language/python/module.scm +++ b/modules/language/python/module.scm @@ -7,6 +7,7 @@ #:use-module (language python yield) #:use-module (language python try) #:use-module (language python dir) + #:use-module (language python list) #:export (Module private public import)) (define-syntax-rule (aif it p x y) (let ((it p)) (if it x y))) @@ -121,7 +122,6 @@ (rawset self '_private #f) (if (not (rawref self '_module)) (begin - (set self '__dict__ self) (set self '__name__ (string-join (map symbol->string (reverse nm)) ".")) (let* ((_module (in-scheme (resolve-module (reverse l)))) @@ -135,20 +135,18 @@ (set self '_module _module) (hash-set! _modules l self)))))) - (define __getattribute__ + (define __getattr__ (lambda (self k) (define (fail) - (raise (KeyError "getattr in Module"))) - (aif it (rawref self k) - it - (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))))) + (raise (AttributeError "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) @@ -175,13 +173,25 @@ (raise KeyError "delattr of missing key in Module"))) (fail)))) + (define __dir__ + (lambda (self) + (let* ((h (slot-ref self 'h)) + (l '()) + (add (lambda (k . u) (set! l (cons (symbol->string k) l))))) + (hash-for-each add h) + (aif it (ref self '_module) + (module-for-each add it) + #f) + (py-list l)))) + + (define __repr__ (lambda (self) (format #f "Module(~a)" (ref self '__name__)))) (define __getitem__ (lambda (self k) (define k (if (string? k) (string->symbol k) k)) - (__getattribute__ self k))) + (__getattr__ self k))) (define __iter__ (lambda (self) |