From 4deff738d3727dbe71a66f6f052822ea7cb10963 Mon Sep 17 00:00:00 2001 From: Stefan Israelsson Tampe Date: Thu, 28 Sep 2017 00:33:12 +0200 Subject: set theory --- modules/language/python/set.scm | 135 +++++++++++++++++++++------------------- 1 file changed, 71 insertions(+), 64 deletions(-) (limited to 'modules/language/python/set.scm') 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 () 'dict) +(define-class () dict) -(define-class set () +(define miss (list 'miss)) + +(define-python-class set () (define __init__ (case-lambda ((self) @@ -20,38 +24,38 @@ (cond ((or (is-a? x ) (pair? x) (string? x)) (for ((y : x)) () - (pyhash-set! d y #t))) - ((is-a? x ) + (pylist-set! d y #t))) + ((is-a? x ) (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)))))) -- cgit v1.2.3