diff options
Diffstat (limited to 'modules/language/python/module.scm')
-rw-r--r-- | modules/language/python/module.scm | 55 |
1 files changed, 31 insertions, 24 deletions
diff --git a/modules/language/python/module.scm b/modules/language/python/module.scm index 8e705a8..5cefeba 100644 --- a/modules/language/python/module.scm +++ b/modules/language/python/module.scm @@ -145,13 +145,17 @@ (define (fail) (raise (AttributeError "getattr in Module"))) (let ((k (_k k))) - (let ((x (module-ref (rawref self '_export) k e))) - (if (eq? e x) - (let ((x (module-ref (_m self) k e))) - (if (eq? e x) - (fail) - x)) - x))))) + (cond + ((memq k '(__iter__ __repr__)) + (lambda () ((rawref self k) self))) + (else + (let ((x (module-ref (rawref self '_export) k e))) + (if (eq? e x) + (let ((x (module-ref (_m self) k e))) + (if (eq? e x) + (fail) + x)) + x))))))) (define __setattr__ (lambda (self k v) @@ -190,30 +194,31 @@ (module-for-each add m) (module-for-each add (rawref self '_export)) (py-list l)))) + + + (define __iter__ + (lambda (self) + (let* ((h (slot-ref self 'h)) + (l '()) + (m (_m self)) + (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) + (module-for-each add (rawref self '_export)) + l))) + (define __repr__ - (lambda (self) (format #f "Module(~a)" (ref self '__name__)))) + (lambda (self) (format #f "Module(~a)" (rawref self '__name__)))) (define __getitem__ (lambda (self k) (define k (if (string? k) (string->symbol k) k)) - (__getattribute__ 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))))))))))) - + (__getattribute__ self k)))) (define-syntax import @@ -270,3 +275,5 @@ (let ((e (Module x))) (pylist-set! modules x e) e)))) + +(set! (@@ (oop pf-objects) Module) Module) |