diff options
Diffstat (limited to 'modules/language/python/dir.scm')
-rw-r--r-- | modules/language/python/dir.scm | 91 |
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) + + + |