1 (define-module (language python set
)
2 #:use-module
(oop pf-objects
)
3 #:use-module
(oop goops
)
4 #:use-module
(ice-9 format
)
5 #:use-module
(language python exceptions
)
6 #:use-module
(language python dict
)
7 #:use-module
(language python for
)
8 #:use-module
(language python try
)
9 #:use-module
(language python list
)
10 #:use-module
(language python yield
)
11 #:use-module
(language python persist
)
12 #:use-module
(language python bool
)
13 #:export
(py-set frozenset weak-set
))
15 (define-class <set
> () dict
)
21 (let ((h (make-py-hashtable)))
25 (py-hash-set! h
(caar a
) (cdar a
))
28 (hash-fold (lambda (k v s
) (cons (cons k v
) s
))
30 (slot-ref o
'dict
)))))
33 (define miss
(list 'miss
))
35 (define-method (< (o1 <set
>) ( o2
<set
>))
36 (and (not (equal? o1 o2
))
43 (define-method (> (o1 <set
>) ( o2
<set
>))
44 (and (not (equal? o1 o2
))
51 (define-method (<= (o1 <set
>) ( o2
<set
>))
58 (define-method (>= (o1 <set
>) ( o2
<set
>))
65 (define-method (in k
(o <set
>))
66 (in k
(slot-ref o
'dict
)))
68 (define-syntax-rule (mk set make-py-hashtable
)
69 (define-python-class set
(<set
>)
73 (slot-set! self
'dict
(make-py-hashtable)))
75 (let ((d (make-py-hashtable)))
76 (slot-set! self
'dict d
)
80 (pylist-set! d y
#t
)))))))
84 (bool (slot-ref self
'dict
))))
88 (call-with-values (lambda () (pylist-pop! (slot-ref self
'dict
)))
93 (pylist-set! (slot-ref self
'dict
) k
#t
)))
97 (let ((dict (py-copy (slot-ref self
'dict
))))
102 (let* ((d (slot-ref self
'dict
))
107 (for ((x : (car l
))) ()
109 (pylist-delete! r x
)))
113 (define difference_update
115 (let* ((r (slot-ref self
'dict
)))
119 (for ((x : (car l
))) ()
121 (pylist-delete! r x
)))
127 (let* ((r (slot-ref self
'dict
)))
131 (pylist-delete! r
(car l
))
136 (let* ((d (slot-ref self
'dict
))
141 (for ((k v
: r
)) ((dels '()))
142 (if (not (__contains__ y k
))
146 (let lp
((dels dels
))
149 (pylist-delete! r
(car dels
))
154 (define intersection_update
156 (let* ((r (slot-ref self
'dict
)))
160 (for ((k v
: r
)) ((dels '()))
161 (if (not (__contains__ y k
))
165 (let lp
((dels dels
))
168 (pylist-delete! r
(car dels
))
174 (let* ((r (slot-ref self
'dict
))
189 (let* ((r (slot-ref self
'dict
)))
191 (if (not (__contains__ x k
))
198 (let* ((r (slot-ref self
'dict
)))
207 (let* ((r (slot-ref self
'dict
)))
209 (raise KeyError
"missing key in set at remove")
210 (pylist-delete! r x
)))))
212 (define symmetric_difference
214 (union (difference self x
) (difference x self
))))
216 (define symmetric_difference_update
218 (difference_update self x
)
219 (update self
(difference x self
))))
223 (let* ((d (slot-ref self
'dict
))
228 (for ((k : (car l
))) ()
229 (pylist-set! r k
#t
))
235 (let* ((r (slot-ref self
'dict
)))
239 (for ((k v
: (car l
))) ()
240 (pylist-set! r k
#t
))
246 (let* ((r (py-keys (slot-ref self
'dict
)))
251 (format #f
"set([])"))
253 (format #f
"set([~a~{, ~a~}])" (car l
) (cdr l
)))))))
257 (let* ((d (slot-ref self
'dict
))
259 (not (eq? miss
(py-hash-ref t x miss
))))))
263 (intersection self op
)))
271 (difference self op
)))
275 (symmetric_difference self op
)))
281 (eq?
(ref self
'__class__
1) (ref x
'__class__
2))
282 (equal?
(ref self
'd
1) (ref x
'd
2)))))
288 (for ((k v
: (slot-ref self
'dict
))) ()
292 (mk set make-py-hashtable
)
293 (mk weak-set make-py-weak-key-hashtable
)
296 (define-python-class frozenset
(set))