summaryrefslogtreecommitdiff
path: root/modules/language/python/set.scm
diff options
context:
space:
mode:
Diffstat (limited to 'modules/language/python/set.scm')
-rw-r--r--modules/language/python/set.scm135
1 files changed, 71 insertions, 64 deletions
diff --git a/modules/language/python/set.scm b/modules/language/python/set.scm
index 5a9cddc..3164c8f 100644
--- a/modules/language/python/set.scm
+++ b/modules/language/python/set.scm
@@ -1,15 +1,19 @@
-(define-module (language prolog set)
+(define-module (language python set)
#:use-module (oop pf-objects)
#:use-module (oop goops)
- #:use-module (language prolog dict)
- #:use-module (language prolog for)
- #:use-module (language prolog try)
- #:use-module (language prolog list)
- #:(set))
+ #:use-module (language python exceptions)
+ #:use-module (language python dict)
+ #:use-module (language python for)
+ #:use-module (language python try)
+ #:use-module (language python list)
+ #:use-module (language python yield)
+ #:export(set))
-(define-class <set> () 'dict)
+(define-class <set> () dict)
-(define-class set (<set>)
+(define miss (list 'miss))
+
+(define-python-class set (<set>)
(define __init__
(case-lambda
((self)
@@ -20,38 +24,38 @@
(cond
((or (is-a? x <py-list>) (pair? x) (string? x))
(for ((y : x)) ()
- (pyhash-set! d y #t)))
- ((is-a? x <py-hash>)
+ (pylist-set! d y #t)))
+ ((is-a? x <py-hashtable>)
(slot-set! self 'dict x))
(else
(raise TypeError)))))))
(define pop
(lambda (self)
- (call-with-values (lambda () (pyhash-pop! (slot-ref self 'dict)))
+ (call-with-values (lambda () (pylist-pop! (slot-ref self 'dict)))
(lambda (k v) k))))
(define add
(lambda (self k)
- (pyhash-set! (slot-ref self 'dict) k #t)))
+ (pylist-set! (slot-ref self 'dict) k #t)))
(define copy
(lambda (self)
- (let ((dict (pyhash-copy (slot-ref self 'dict))))
+ (let ((dict (py-copy (slot-ref self 'dict))))
(set dict))))
(define difference
(lambda (self . l)
(let* ((d (slot-ref self 'dict))
- (r (pyhash-copy d)))
+ (r (py-copy d)))
(let lp ((l l))
(if (pair? l)
(begin
(for ((x : (car l))) ()
- (when (not (eq? miss (pyhash-ref d x miss)))
- (pyhash-remove! r x)))
+ (when (in x d)
+ (pylist-delete! r x)))
(lp (cdr l)))))
- r)))
+ (set r))))
(define difference_update
(lambda (self . l)
@@ -60,8 +64,8 @@
(if (pair? l)
(begin
(for ((x : (car l))) ()
- (when (not (eq? miss (pyhash-ref d x miss)))
- (pyhash-remove! r x)))
+ (when (in x r)
+ (pylist-delete! r x)))
(lp (cdr l)))))
(values))))
@@ -71,28 +75,28 @@
(let lp ((l l))
(if (pair? l)
(begin
- (pyhash-remove! d (car l))
+ (pylist-delete! r (car l))
(lp (cdr l))))))))
(define intersection
(lambda (self . l)
(let* ((d (slot-ref self 'dict))
- (r (pyhash-copy d)))
+ (r (py-copy d)))
(let lp ((l l))
(if (pair? l)
(let ((y (car l)))
- (for ((k : r)) ((dels '()))
- (if (not (eq? miss (pylist-ref y k miss)))
- (cons k dels)
- dels)
- #:finally
+ (for ((k v : r)) ((dels '()))
+ (if (not (__contains__ y k))
+ (cons k dels)
+ dels)
+ #:final
(let lp ((dels dels))
(if (pair? dels)
(begin
- (pylist-remove! r (car dels))
+ (pylist-delete! r (car dels))
(lp (cdr dels))))))
(lp (cdr l)))))
- r)))
+ (set r))))
(define intersection_update
(lambda (self . l)
@@ -100,15 +104,15 @@
(let lp ((l l))
(if (pair? l)
(let ((y (car l)))
- (for ((k : r)) ((dels '()))
- (if (not (eq? miss (pylist-ref y k miss)))
+ (for ((k v : r)) ((dels '()))
+ (if (not (__contains__ y k))
(cons k dels)
dels)
- #:finally
+ #:final
(let lp ((dels dels))
(if (pair? dels)
(begin
- (pylist-remove! r (car dels))
+ (pylist-delete! r (car dels))
(lp (cdr dels))))))
(lp (cdr l))))))))
@@ -121,34 +125,34 @@
(let ((xx x))
(set! x r)
(set! r xx)))
- (for ((k : r)) ()
- (if (not (eq? miss (pylist-ref x 'k miss)))
+ (for ((k v : r)) ()
+ (if (in k x)
(break #f))
- #:finally
+ #:final
#t))))
(define issubset
(lambda (self x)
(let* ((r (slot-ref self 'dict)))
- (for ((k : r))
- (if (eq? miss (pylist-ref x 'k miss))
+ (for ((k v : r)) ()
+ (if (not (__contains__ x k))
(break #f))
- #:finally
+ #:final
#t))))
(define issuperset
(lambda (self x)
- (let* ((r (slot-ref self 'dict)))
- (for ((x : r))
- (if (eq? miss (pylist-ref r 'k miss))
+ (let* ((r (slot-ref self 'dict)))
+ (for ((x v : r)) ()
+ (if (not (in x r))
(break #f))
- #:finally
+ #:final
#t))))
(define remove
(lambda (self x)
(let* ((r (slot-ref self 'dict)))
- (if (eq? miss (pylist-ref r x miss))
+ (if (not (in x r))
(raise KeyError "missing key in set at remove")
(pylist-delete! r x)))))
@@ -164,14 +168,14 @@
(define union
(lambda (self . l)
(let* ((d (slot-ref self 'dict))
- (r (pyhash-copy d)))
+ (r (py-copy d)))
(let lp ((l l))
(if (pair? l)
(begin
(for ((k : (car l))) ()
(pylist-set! r k #t))
(lp (cdr l)))
- r)))))
+ (set r))))))
(define update
(lambda (self . l)
@@ -179,28 +183,31 @@
(let lp ((l l))
(if (pair? l)
(begin
- (for ((k : (car l))) ()
+ (for ((k v : (car l))) ()
(pylist-set! r k #t))
(lp (cdr l)))
(values))))))
+
+ (define __repr__
+ (lambda (self)
+ (let* ((r (py-keys (slot-ref self 'dict)))
+ (n (len r))
+ (l (to-list r)))
+ (cond
+ ((= n 0)
+ (format #f "set([])"))
+ (else
+ (format #f "set([~a~{, ~a~}])" (car l) (cdr l)))))))
- (define __repr__(self):
- (let ((r (py-keys (slot-ref self 'dicy)))
- (n (len r))
- (l (to-list r)))
- (cond
- ((= n 0)
- (format #f "set([])"))
- (else
- (format #f "set([~a ~{, ~a~}])" (car l) (cdr l))))))
-
+ (define __contains__
+ (lambda (self x)
+ (let* ((d (slot-ref self 'dict))
+ (t (slot-ref d 't)))
+ (not (eq? miss (py-hash-ref t x miss))))))
+
(define __iter__
(make-generator (self)
- (lambda (yield self)
- (for ((k : (slot-ref self 'dict))) ()
- (yield k)
- (values))))))
-
-
-
-
+ (lambda (yield self)
+ (for ((k v : (slot-ref self 'dict))) ()
+ (yield k)
+ (values))))))