diff options
Diffstat (limited to 'modules/language')
-rw-r--r-- | modules/language/python/list.scm | 77 | ||||
-rw-r--r-- | modules/language/python/module/python.scm | 8 | ||||
-rw-r--r-- | modules/language/python/string.scm | 1 |
3 files changed, 54 insertions, 32 deletions
diff --git a/modules/language/python/list.scm b/modules/language/python/list.scm index 5b4daf0..36d15e9 100644 --- a/modules/language/python/list.scm +++ b/modules/language/python/list.scm @@ -1,8 +1,10 @@ (define-module (language python list) #:use-module (ice-9 match) + #:use-module (ice-9 control) #:use-module (oop pf-objects) #:use-module (oop goops) #:use-module (language python hash) + #:use-module (language python tuple) #:use-module (language python exceptions) #:use-module (language python yield) #:use-module (language python for) @@ -21,7 +23,7 @@ (define-syntax-rule (aif it p x y) (let ((it p)) (if it x y))) -(define-class <py-list> () vec n) +(define-class <py-list> () vec n) (define-method (pylist-delete! (o <py-list>) k) (let* ((n (slot-ref o 'n)) @@ -60,8 +62,7 @@ (next-method))) -(define-method (to-list (x <pair>)) - x) +(defpair (to-list x) x) (define-method (to-list (x <yield>)) (define l '()) @@ -84,7 +85,7 @@ (define-method (to-pylist (l <py-list>)) l) -(define-method (to-pylist (l <pair>)) +(defpair (to-pylist l) (let* ((n (length l)) (vec (make-vector (* 2 n))) (o (make <py-list>))) @@ -121,9 +122,8 @@ (vector-ref (slot-ref o 'vec) n) (raise IndexError))) -(define-method (pylist-ref (o <pair>) n) - (define n (if (< n 0) (+ (length o) n))) - (list-ref o n)) +(defpair (pylist-ref o n) + (list-ref o (if (< n 0) (+ (length o) n) n))) (define-method (pylist-ref (o <vector>) n) (vector-ref o n)) @@ -142,10 +142,10 @@ (vector-set! (slot-ref o 'vec) n val) (raise IndexError))) -(define-method (pylist-set! (o <pair>) n val) +(defpair (pylist-set! o n val) (list-set! o n val)) -(define-method (pylist-set! (o <vector>) n val) +(defpair (pylist-set! o n val) (vector-set! o n val)) (define-method (pylist-set! (o <p>) n val) @@ -180,7 +180,7 @@ (to-list (pylist-slice (to-pylist o) n1 n2 n3))))) -(define-method (pylist-slice (o <pair>) n1 n2 n3) +(defpair (pylist-slice o n1 n2 n3) (to-list (pylist-slice (to-pylist o) n1 n2 n3))) @@ -308,6 +308,12 @@ (define-method (+ (o1 <pair>) (o2 <pair>)) (append o1 o2)) +(define-method (+ (o1 <py-tuple>) o2) + (+ (slot-ref o1 'l) o2)) + +(define-method (+ o2 (o1 <py-tuple>)) + (+ o2 (slot-ref o1 'l))) + (define-method (+ (o1 <string>) (o2 <string>)) (string-append o1 o2)) @@ -354,7 +360,9 @@ (lp1 (+ i 1) j))))) vec2)) -(define-method (* (x <integer>) (l <pair>)) (* l x)) +(define-method (* (x <integer> ) (l <pair>)) (* l x)) +(define-method (* (x <py-tuple>) l) (* (slot-ref x 'l) l)) +(define-method (* l (x <py-tuple>)) (* l (slot-ref x 'l))) (define-method (* (l <pair>) (x <integer>)) (let lp1 ((i 0)) (if (< i x) @@ -423,7 +431,7 @@ (lp (+ i 1) sum )) sum)))) -(define-method (pylist-count (l <pair>) q) +(defpair (pylist-count l q) (let lp ((l l) (sum 0)) (if (pair? l) (if (eq? (car l) q) @@ -608,7 +616,7 @@ (raise ValueError "could not find value in index fkn"))) (raise IndexError "index out of scop in index fkn")))))) -(define-method (pylist-index (o <pair>) val . l) +(defpair (pylist-index o val . l) (let* ((n (length o)) (f (lambda (m) (if (< m 0) (+ m n) m)))) (call-with-values @@ -639,7 +647,7 @@ #:len -(define-method (len (l <pair> )) (length l)) +(defpair (len l) (length l)) (define-method (len (v <vector>)) (vector-length v)) (define-method (len (s <string>)) (string-length s)) (define-method (len (o <py-list>)) (slot-ref o 'n)) @@ -648,7 +656,8 @@ (it) (next-method))) -(define-method (in x (l <pair>)) (member x l)) +(define-method (in x (l <py-tuple>)) (member x (slot-ref l 'l))) +(define-method (in x (l <pair>)) (member x l)) (define-method (in x (l <vector>)) (define n (vector-length l)) (let lp ((i 0)) @@ -658,15 +667,17 @@ (lp (+ i 1))) #f))) -(define-method (in x (s <string>)) - (let ((n (string-length s)) - (x (if (string? x) (string-ref x 0) x))) - (let lp ((i 0)) - (if (< i n) - (if (equal? x (string-ref s i)) - #t - (lp (+ i 1))) - #f)))) +(define-method (in (x <string>) (s <string>)) + (string-contains s x)) + +(define-method (in (x <char>) (s <string>)) + (let/ec ret + (string-for-each + (lambda (ch) + (if (eq? ch x) + (ret #t))) + s)) + #f) (define-method (in x (o <py-list>)) (define l (slot-ref o 'vec)) @@ -683,17 +694,25 @@ (it x) (next-method))) -(define-syntax-rule (defgen (op o1 o2) code ...) +(define-syntax-rule (defgen (op r s o1 o2) code ...) (begin (define-method (op (o1 <py-list>) (o2 <py-list>)) code ...) (define-method (op (o1 <pair>) (o2 <pair> )) code ...) + (define-method (op (o1 <py-tuple>) o2) + (op (slot-ref o1 'l) o2)) + (define-method (op o2 (o1 <py-tuple>)) + (op o2 (slot-ref o1 'l))) (define-method (op (o1 <vector>) (o2 <vector>)) code ...) (define-method (op (o1 <p>) o2) (aif it (ref o1 'r) (it o2) + (next-method))) + (define-method (op o1 (o2 <p>)) + (aif it (ref o2 's) + (it o1) (next-method))))) -(defgen (< o1 o2) +(defgen (< __le__ __gt__ o1 o2) (let ((n1 (len o1)) (n2 (len o2))) (for ((x1 : o1) (x2 : o2)) () @@ -702,7 +721,7 @@ #:final (< n1 n2)))) -(defgen (<= o1 o2) +(defgen (<= __lt__ __ge__ o1 o2) (let ((n1 (len o1)) (n2 (len o2))) (for ((x1 : o1) (x2 : o2)) () @@ -711,7 +730,7 @@ #:final (<= n1 n2)))) -(defgen (> o1 o2) +(defgen (> __ge__ __lt__ o1 o2) (let ((n1 (len o1)) (n2 (len o2))) (for ((x1 : o1) (x2 : o2)) () @@ -720,7 +739,7 @@ #:final (> n1 n2)))) -(defgen (>= o1 o2) +(defgen (>= __gt__ __le__ o1 o2) (let ((n1 (len o1)) (n2 (len o2))) (for ((x1 : o1) (x2 : o2)) () diff --git a/modules/language/python/module/python.scm b/modules/language/python/module/python.scm index fd411e9..c391907 100644 --- a/modules/language/python/module/python.scm +++ b/modules/language/python/module/python.scm @@ -21,16 +21,18 @@ #:use-module (language python hash ) #:use-module (language python property ) #:use-module (language python range ) + #:use-module (language python tuple ) - #:replace (list abs min max) + #:replace (list abs min max hash) #:re-export (Exception StopIteration send sendException next GeneratorExit sendClose RuntimeError - len dir next dict None property range) + len dir next dict None property range + tuple) #:export (print repr complex float int round set all any bin callable chr classmethod staticmethod divmod enumerate filter format - getattr hasattr hash hex isinstance + getattr hasattr hex isinstance iter map sum id input oct ord pow super)) (define-syntax-rule (aif it p x y) (let ((it p)) (if it x y))) diff --git a/modules/language/python/string.scm b/modules/language/python/string.scm index 6ac8874..589f1e7 100644 --- a/modules/language/python/string.scm +++ b/modules/language/python/string.scm @@ -538,3 +538,4 @@ (pylist-sort! l) l)) + |