From 60ae7434ea97420b6031a1a803b4332f4c1f8d79 Mon Sep 17 00:00:00 2001 From: Stefan Israelsson Tampe Date: Mon, 18 Sep 2017 19:13:34 +0200 Subject: reverse! count --- modules/language/python/list.scm | 146 ++++++++++++++++++++++++++++++++++----- 1 file changed, 129 insertions(+), 17 deletions(-) (limited to 'modules/language/python/list.scm') diff --git a/modules/language/python/list.scm b/modules/language/python/list.scm index 8b25077..ac35e88 100644 --- a/modules/language/python/list.scm +++ b/modules/language/python/list.scm @@ -7,10 +7,13 @@ #:use-module (language python try) #:use-module (language python exceptions) #:export (to-list pylist-ref pylist-set! pylist-append! - pylist-slice pylist-subset!)) + pylist-slice pylist-subset! pylist-reverse! + pylist-pop! pylist-count)) (define-syntax-rule (aif it p x y) (let ((it p)) (if it x y))) +(define-class () vec n) + (define-method (to-list x) (if (vector? x) (vector->list x) @@ -30,11 +33,18 @@ (lambda x (reverse l)))) -(define-class () vec n) +(define-method (to-list (x )) + (let ((vec (slot-ref x 'vec)) + (n (slot-ref x 'n))) + (let lp ((i 0)) + (if (< i n) + (cons (vector-ref vec i) (lp (+ i 1))) + '())))) (define-method (to-pylist (l )) l) + (define-method (to-pylist (l )) (let* ((n (length l)) (vec (make-vector (* 2 n))) @@ -175,20 +185,10 @@ (raise 'NotSupportedOP '__append__)) (define-method (pylist-append! (o

) n . l) - (aif it (ref o '__append__) - (it n) - (aif it (ref o 'append) - (apply it n l) - (error "no append")))) - + (aif it (ref o 'append) + (apply it n l) + (error "no append"))) -(define-method (to-list (x )) - (let ((vec (slot-ref x 'vec)) - (n (slot-ref x 'n))) - (let lp ((i 0)) - (if (< i n) - (cons (vector-ref vec i) (lp (+ i 1))) - '())))) (define-method (write (o ) . l) @@ -232,9 +232,121 @@ (slot-set! o 'vec vec) o)) + (define-method (+ (o1 ) (o2 )) (append o1 o2)) - + +(define-method (+ (o1 ) (o2 )) + (string-append o1 o2)) + +(define-method (* (o1 ) (x )) + (let* ((vec (slot-ref o1 'vec)) + (n (slot-ref o1 'n)) + (n2 (* n x)) + (vec2 (make-vector (* 2 n2))) + (o (make ))) + + (let lp1 ((i 0) (j 0)) + (if (< i x) + (let lp2 ((j j) (k 0)) + (if (< k n) + (begin + (vector-set! vec2 j (vector-ref vec k)) + (lp2 (+ j 1) (+ k 1))) + (lp1 (+ i 1) j))))) + (slot-set! o 'n n2 ) + (slot-set! o 'vec vec2) + o)) + +(define-method (* (vec ) (x )) + (let* ((n (string-length vec)) + (n2 (* n x)) + (vec2 (make-string n2))) + + (let lp1 ((i 0) (j 0)) + (if (< i x) + (let lp2 ((j j) (k 0)) + (if (< k n) + (begin + (string-set! vec2 j (string-ref vec k)) + (lp2 (+ j 1) (+ k 1))) + (lp1 (+ i 1) j))))) + vec2)) + +(define-method (* (l ) (x )) + (let lp1 ((i 0)) + (if (< i x) + (let lp2 ((k l)) + (if (pair? k) + (cons (car k) (lp2 (cdr k))) + (lp1 (+ i 1)))) + '()))) + + +(define-method (+ (o1 ) (o2 )) + (append o1 o2)) + +(define-method (+ (o1 ) (o2 )) + (string-append o1 o2)) + +;;REVERSE +(define-method (pylist-reverse! (o )) + (let* ((N (slot-ref o 'n)) + (M (- N 1)) + (n (floor-quotient N 2)) + (vec (slot-ref o 'vec))) + (let lp ((i 0)) + (if (< i n) + (let ((swap (vector-ref vec i)) + (k (- M i))) + (vector-set! vec i (vector-ref vec k)) + (vector-set! vec k swap)))))) + +(define-method (pylist-reverse! (o

)) ((ref o 'reverse))) + +;;POP! +(define-method (pylist-pop! (o )) + (let* ((n (slot-ref o 'n)) + (m (- n 1)) + (vec (slot-ref o 'vec))) + (if (> n 0) + (let ((ret (vector-ref vec m))) + (slot-set! o 'n m) + (vector-set! vec m #f) + ret) + (raise IndexError "pop from empty list")))) + +(define-method (pylist-pop! (o

)) ((ref o 'pop))) + +;;COUNT +(define-method (pylist-count (o ) q) + (let* ((n (slot-ref o 'n)) + (vec (slot-ref o 'vec))) + (let lp ((i 0) (sum 0)) + (if (< i n) + (if (equal? (vector-ref vec i) q) + (lp (+ i 1) (+ sum 1)) + (lp (+ i 1) sum )) + sum)))) + +(define-method (pylist-count (s ) q) + (let* ((n (string-length s)) + (q (if (and (string? q) (= (string-length q) 1)) + (string-ref q 0)))) + (let lp ((i 0) (sum 0)) + (if (< i n) + (if (eq? (string-ref s i) q) + (lp (+ i 1) (+ sum 1)) + (lp (+ i 1) sum )) + sum)))) + +(define-method (pylist-count (l ) q) + (let lp ((l l) (sum 0)) + (if (pair? l) + (if (eq? (car l) q) + (lp (cdr l) (+ sum 1)) + (lp (cdr l) sum )) + sum))) - +(define-method (pylist-count (o

) q) ((ref o 'count) q)) -- cgit v1.2.3