small steps
[software/python-on-guile.git] / modules / language / python / module.scm
index ab963d180ebe7d236cf2cb6dd940e2d590fb5466..5c5d630354a3f357373510ecf7fc8af1dcba81fe 100644 (file)
@@ -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)))
       (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))))
              (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)
                (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)