summaryrefslogtreecommitdiff
path: root/modules/language/python/dir.scm
diff options
context:
space:
mode:
Diffstat (limited to 'modules/language/python/dir.scm')
-rw-r--r--modules/language/python/dir.scm91
1 files changed, 91 insertions, 0 deletions
diff --git a/modules/language/python/dir.scm b/modules/language/python/dir.scm
new file mode 100644
index 0000000..ecd85cf
--- /dev/null
+++ b/modules/language/python/dir.scm
@@ -0,0 +1,91 @@
+(define-module (language python dir)
+ #:use-module (language python list)
+ #:use-module (language python for)
+ #:use-module (language python dict)
+ #:use-module (language python string)
+ #:use-module (oop goops)
+ #:use-module (ice-9 vlist)
+ #:use-module (oop pf-objects)
+ #:export (dir))
+
+(define-syntax-rule (aif it p x y) (let ((it p)) (if it x y)))
+
+(define-method (dir) (pylist))
+
+(define (get-from-class c f)
+ (let lp ((c c))
+ (hash-for-each f c)
+ (let lpp ((pl (ref c '__parents__)))
+ (if (pair? pl)
+ (begin
+ (lp (car pl))
+ (lpp (cdr pl)))))))
+
+(define (get-from-class-f c f)
+ (let lp ((c c))
+ (vhash-fold f 0 c)
+ (let lpp ((pl (ref c '__parents__)))
+ (if (pair? pl)
+ (begin
+ (lp (car pl))
+ (lpp (cdr pl)))))))
+
+(define-method (dir (o <p>))
+ (if (pyclass? o)
+ (aif it (ref o '__dir__)
+ (it)
+ (aif it (ref o '__dict__)
+ (let ((l (pylist)))
+ (for ((k v : it)) ()
+ (pylist-append! l k))
+ l)
+ (let* ((h (make-hash-table))
+ (c (ref o '__class__))
+ (l (pylist))
+ (f (lambda (k v) (pylist-append! h k #t))))
+ (hash-for-each f o)
+ (get-from-class c f)
+ (hash-for-each (lambda (k v) (pylist-append! l k)) h)
+ (pylist-sort! l)
+ l)))
+ (let* ((h (make-hash-table))
+ (c o)
+ (l '())
+ (f (lambda (k v) (pylist-append! h k #t))))
+ (get-from-class c f)
+ (hash-for-each (lambda (k v) (set! l (cons k l))) h)
+ (to-pylist (map symbol->string (sort l <))))))
+
+(define-method (dir (o <pf>))
+ (if (pyclass? o)
+ (aif it (ref o '__dir__)
+ (it)
+ (aif it (ref o '__dict__)
+ (let ((l (pylist)))
+ (for ((k v : it)) ()
+ (pylist-append! l k))
+ l)
+ (let* ((h (make-hash-table))
+ (c (ref o '__class__))
+ (l (pylist))
+ (f (lambda (k v s) (pylist-append! h k #t))))
+ (vhash-fold f 0 o)
+ (get-from-class-f c f)
+ (hash-for-each (lambda (k v) (pylist-append! l k)) h)
+ (pylist-sort! l)
+ l)))
+ (let* ((h (make-hash-table))
+ (c o)
+ (l '())
+ (f (lambda (k v s) (pylist-append! h k #t))))
+ (get-from-class-f c f)
+ (hash-for-each (lambda (k v) (set! l (cons k l))) h)
+ (to-pylist (map symbol->string (sort l <))))))
+
+(define-method (dir (o <py-list> )) (pylist-listing))
+(define-method (dir (o <hashtable> )) pyhash-listing)
+(define-method (dir (o <py-hashtable>)) pyhash-listing)
+(define-method (dir (o <string> )) string-listing)
+
+
+