delete of vectors and dict elements now works as it should
authorStefan Israelsson Tampe <stefan.itampe@gmail.com>
Sat, 23 Sep 2017 21:23:38 +0000 (23:23 +0200)
committerStefan Israelsson Tampe <stefan.itampe@gmail.com>
Sat, 23 Sep 2017 21:23:38 +0000 (23:23 +0200)
modules/language/python/compile.scm
modules/language/python/dict.scm
modules/language/python/list.scm

index dc608a4023ab4f71b97b652e48f3a64fc946b987..ec4215ba533d11089a168fa72c86af2dc88d1617 100644 (file)
    ((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))
     
   ((_ 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)
     ((_ 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)
index 5442720f67e95d849c4a45a0b5316db6f1deb610..b24031bba6629d6f5532c8c3131c855e07fcec38 100644 (file)
@@ -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))
         (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)
   (<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'
           (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))
+
index 094c7860b2deb801905844da622717bab988e74f..9517aeb5c4ec9564584a2d9b23944aeb737c73bb 100644 (file)
             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)))
   (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))
   (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))