summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorStefan Israelsson Tampe <stefan.itampe@gmail.com>2017-09-18 19:13:34 +0200
committerStefan Israelsson Tampe <stefan.itampe@gmail.com>2017-09-18 19:13:34 +0200
commit60ae7434ea97420b6031a1a803b4332f4c1f8d79 (patch)
tree14b063425aba70e5af29afcbabe028800acb7762 /modules
parenta8b567b3045e45d86d38b959be32df3a71d564ec (diff)
reverse! count
Diffstat (limited to 'modules')
-rw-r--r--modules/language/python/compile.scm4
-rw-r--r--modules/language/python/list.scm146
2 files changed, 132 insertions, 18 deletions
diff --git a/modules/language/python/compile.scm b/modules/language/python/compile.scm
index 46a9199..9076e61 100644
--- a/modules/language/python/compile.scm
+++ b/modules/language/python/compile.scm
@@ -169,7 +169,7 @@
(case x
;; Lists
((append) (L 'pylist-append!))
- ((count) (L 'pylist-count!))
+ ((count) (L 'pylist-count))
((extend) (L 'pylist-extend!))
((index) (L 'pylist-index))
((pop) (L 'pylist-pop!))
@@ -184,6 +184,7 @@
(() '())
((x . l)
(let ((is-fkn? (match l
+ ((#f) #t)
(((#:arglist . _) . _)
#t)
(_
@@ -318,6 +319,7 @@
(list e))
((x . trailer)
(let ((is-fkn? (match trailer
+ ((#f) #t)
(((#:arglist . _) . _)
#t)
(_
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 <py-list> () vec n)
+
(define-method (to-list x)
(if (vector? x)
(vector->list x)
@@ -30,11 +33,18 @@
(lambda x
(reverse l))))
-(define-class <py-list> () vec n)
+(define-method (to-list (x <py-list>))
+ (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 <py-list>))
l)
+
(define-method (to-pylist (l <pair>))
(let* ((n (length l))
(vec (make-vector (* 2 n)))
@@ -175,20 +185,10 @@
(raise 'NotSupportedOP '__append__))
(define-method (pylist-append! (o <p>) 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 <py-list>))
- (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 <py-list>) . l)
@@ -232,9 +232,121 @@
(slot-set! o 'vec vec)
o))
+
(define-method (+ (o1 <pair>) (o2 <pair>))
(append o1 o2))
-
+
+(define-method (+ (o1 <string>) (o2 <string>))
+ (string-append o1 o2))
+
+(define-method (* (o1 <py-list>) (x <integer>))
+ (let* ((vec (slot-ref o1 'vec))
+ (n (slot-ref o1 'n))
+ (n2 (* n x))
+ (vec2 (make-vector (* 2 n2)))
+ (o (make <py-list>)))
+
+ (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 <string>) (x <integer>))
+ (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 <pair>) (x <integer>))
+ (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 <pair>) (o2 <pair>))
+ (append o1 o2))
+
+(define-method (+ (o1 <string>) (o2 <string>))
+ (string-append o1 o2))
+
+;;REVERSE
+(define-method (pylist-reverse! (o <py-list>))
+ (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 <p>)) ((ref o 'reverse)))
+
+;;POP!
+(define-method (pylist-pop! (o <py-list>))
+ (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 <p>)) ((ref o 'pop)))
+
+;;COUNT
+(define-method (pylist-count (o <py-list>) 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 <string>) 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 <pair>) 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 <p>) q) ((ref o 'count) q))