diff options
Diffstat (limited to 'modules')
-rw-r--r-- | modules/language/python/compile.scm | 32 | ||||
-rw-r--r-- | modules/language/python/dict.scm | 25 | ||||
-rw-r--r-- | modules/language/python/list.scm | 33 |
3 files changed, 77 insertions, 13 deletions
diff --git a/modules/language/python/compile.scm b/modules/language/python/compile.scm index dc608a4..ec4215b 100644 --- a/modules/language/python/compile.scm +++ b/modules/language/python/compile.scm @@ -245,8 +245,8 @@ ((values) (Di 'py-values)) ((popitem) (Di 'py-popitem)) ((setdefault) (Di 'py-setdefault)) - ((update) (Di 'py-update)))) - + ((update) (Di 'py-update)) + ((clear) (Di 'py-clear)))) (define (fastfkn x) (hash-ref fasthash x)) @@ -550,8 +550,17 @@ ((_ e1 e2 e3) (list 'if (exp vs e2) (exp vs e1) (exp vs e3)))) - - + (#:del + ;;We don't delete variables + ((_ (#:power #f base () . #f)) + '(void)) + + ((_ (#:power #f base (l ... fin) . #f)) + (let ((add (get-addings vs l)) + (fin (get-addings vs (list fin))) + (f (exp vs base))) + `(,(C 'del-x) (,(C 'ref-x) ,f ,@add) ,@fin)))) + (#:if ((_ test a ((tests . as) ...) . else) `(,(G 'cond) @@ -1454,6 +1463,21 @@ ((_ v (#:vecsub . x) . l) (ref-x (pylist-slice v . x) . l)))) +(define-syntax del-x + (syntax-rules () + ((_ v (#:identifier x)) + (ref-x (refq v 'x))) + ((_ v (#:call-obj x)) + (values)) + ((_ v (#:call x ...)) + (values)) + ((_ v (#:apply x ...)) + (values)) + ((_ v (#:vecref x)) + (pylist-delete! v x)) + ((_ v (#:vecsub x ...)) + (pylist-subset! v x ... pylist-null)))) + (define-syntax set-x (syntax-rules () ((_ v (a ... b) val) diff --git a/modules/language/python/dict.scm b/modules/language/python/dict.scm index 5442720..b24031b 100644 --- a/modules/language/python/dict.scm +++ b/modules/language/python/dict.scm @@ -13,7 +13,7 @@ #:export (make-py-hashtable py-copy py-fromkeys py-get py-has_key py-items py-iteritems py-iterkeys py-itervalues py-keys py-values - py-popitem py-setdefault py-update + py-popitem py-setdefault py-update py-clear )) (define (h x n) (modulo (py-hash x) n)) @@ -52,6 +52,12 @@ (raise KeyError x) r))) +(define-method (pylist-delete! (o <hashtable>) k) + (pyhash-rem! o k)) + +(define-method (pylist-delete! (o <py-hashtable>) k) + (pyhash-rem! o k)) + (define-method (py-hash (o <hashtable>)) (hash-fold (lambda (k v s) @@ -373,6 +379,16 @@ (<py-hashtable> (apply update o l))) +(define-py (py-clear clear o) + (<hashtable> + (hash-clear! o)) + (<py-hashtable> + (let ((t (slot-ref o 't))) + (hash-clear! t) + (slot-set! o 'n 0) + (slot-set! o 'h H) + (values)))) + #| 'viewitems' 'viewkeys' @@ -449,3 +465,10 @@ (values k v)) (throw StopIteration)))) + +(define-method (in key (o <hashtable>)) + (py-has_key o key)) + +(define-method (in key (o <py-hashtable>)) + (py-has_key o key)) + diff --git a/modules/language/python/list.scm b/modules/language/python/list.scm index 094c786..9517aeb 100644 --- a/modules/language/python/list.scm +++ b/modules/language/python/list.scm @@ -13,12 +13,27 @@ pylist-slice pylist-subset! pylist-reverse! pylist-pop! pylist-count pylist-extend! len in pylist-insert! pylist-remove! pylist-sort! - pylist-index)) + pylist-index pylist-null pylist-delete!)) (define-syntax-rule (aif it p x y) (let ((it p)) (if it x y))) (define-class <py-list> () vec n) +(define-method (pylist-delete! (o <py-list>) k) + (let* ((n (slot-ref o 'n)) + (k (if (< k 0) (+ k n) k))) + (pylist-subset! o k (+ k 1) None pylist-null))) + +(define-method (pylist-delete! (o <p>) k) + ((ref o '__delitem__) k)) + +(define pylist-null + (let ((o (make <py-list>))) + (slot-set! o 'vec (make-vector 0)) + (slot-set! o 'n 0) + o)) + + (define-method (py-hash (o <py-list>)) (let ((n (min complexity (slot-ref o 'n))) (v (slot-ref o 'vec))) @@ -37,6 +52,9 @@ ((ref x '__tolist__ (lambda () (error "missing __tolist__ in object"))))) +(define-method (to-list (x <pair>)) + x) + (define-method (to-list (x <yield>)) (define l '()) (catch StopIteration @@ -58,7 +76,6 @@ (define-method (to-pylist (l <py-list>)) l) - (define-method (to-pylist (l <pair>)) (let* ((n (length l)) (vec (make-vector (* 2 n))) @@ -129,9 +146,9 @@ (define N (slot-ref o 'n)) (define (f n) (if (< n 0) (+ N n) n)) - (let* ((n1 (f (if (eq? n1 'None) 0 n1))) - (n2 (f (if (eq? n2 'None) (slot-ref o 'n) n2))) - (n3 (f (if (eq? n3 'None) 1 n3))) + (let* ((n1 (f (if (eq? n1 None) 0 n1))) + (n2 (f (if (eq? n2 None) (slot-ref o 'n) n2))) + (n3 (f (if (eq? n3 None) 1 n3))) (vec (slot-ref o 'vec)) (l (let lp ((i n1)) @@ -159,9 +176,9 @@ (define N (slot-ref o 'n)) (define (f n) (if (< n 0) (+ N n) n)) - (let* ((n1 (f (if (eq? n1 'None) 0 n1))) - (n2 (f (if (eq? n2 'None) (slot-ref o 'n) n2))) - (n3 (f (if (eq? n3 'None) 1 n3))) + (let* ((n1 (f (if (eq? n1 None) 0 n1))) + (n2 (f (if (eq? n2 None) (slot-ref o 'n) n2))) + (n3 (f (if (eq? n3 None) 1 n3))) (vec (slot-ref o 'vec)) (o2 (to-pylist val)) (N2 (slot-ref o2 'n)) |