diff options
Diffstat (limited to 'modules/language/python/module/python.scm')
-rw-r--r-- | modules/language/python/module/python.scm | 77 |
1 files changed, 68 insertions, 9 deletions
diff --git a/modules/language/python/module/python.scm b/modules/language/python/module/python.scm index 96b0aa7..3398dbb 100644 --- a/modules/language/python/module/python.scm +++ b/modules/language/python/module/python.scm @@ -126,15 +126,74 @@ #t (is-a? (ref sub '__goops__) (ref cls '__goops__))))) -(define-method (isinstance x y) #f) +(define-method (isinstance x y) + (if (null? y) + #f + (if (pair? y) + (or (isinstance x (car y)) + (isinstance x (cdr y))) + (is-a? x y)))) + +(define-method (isinstance (i <integer>) y) + (if (issubclass y int) + #t + (if (pair? y) + (or (isinstance i (car y)) + (isinstance i (cdr y))) + (is-a? i y)))) + +(define-method (isinstance (i <real>) y) + (if (issubclass y float) + #t + (if (pair? y) + (or (isinstance i (car y)) + (isinstance i (cdr y))) + (is-a? i y)))) + +(define-method (isinstance (i <pair>) y) + (if (issubclass y tuple) + #t + (if (pair? y) + (or (isinstance i (car y)) + (isinstance i (cdr y))) + (is-a? i y)))) + +(define-method (isinstance (i <string>) y) + (if (issubclass y str) + #t + (if (pair? y) + (or (isinstance i (car y)) + (isinstance i (cdr y))) + (is-a? i y)))) + +(define-method (isinstance (i <bytevector>) y) + (if (issubclass y bytes) + #t + (if (pair? y) + (or (isinstance i (car y)) + (isinstance i (cdr y))) + (is-a? i y)))) + + +(define-method (isinstance o (cl <p>)) + (cond + ((eq? cl py-list) + (is-a? o <py-list>)) + (else #f))) + (define-method (isinstance (o <p>) (cl <p>)) - (aif it (ref cl '__instancecheck__) - (it o) - (if (pair? cl) - (or - (isinstance o (car cl)) - (isinstance o (cdr cl))) - (is-a? o (ref cl '__goops__))))) + (cond + ((ref cl '__instancecheck__) => + (lambda (it) + (it o))) + ((pair? cl) + (or + (isinstance o (car cl)) + (isinstance o (cdr cl)))) + (else + (is-a? o (ref cl '__goops__))))) + + (define iter (case-lambda @@ -177,7 +236,7 @@ (define (id x) (object-address x)) (define (input str) - (format #t str) + ((@ (guile) format) #t str) (readline)) (define (idx x) x) |