diff options
Diffstat (limited to 'modules/language/python/dict.scm')
-rw-r--r-- | modules/language/python/dict.scm | 117 |
1 files changed, 98 insertions, 19 deletions
diff --git a/modules/language/python/dict.scm b/modules/language/python/dict.scm index 0e130d0..18420dd 100644 --- a/modules/language/python/dict.scm +++ b/modules/language/python/dict.scm @@ -191,7 +191,7 @@ (let ((ret (py-hash-ref t key miss))) (if (eq? ret miss) (begin - (py-hash-set! t key val) + (py-hash-set! t key val) (slot-set! o 'n (+ n 1)) (slot-set! o 'hash (logxor (xy (py-hash key) (py-hash val)) h))) (begin @@ -275,7 +275,7 @@ (let ((elseval (match l (() None) ((v) v)))) - (let ((ret (ref o k miss))) + (let ((ret (py-hash-ref o k miss))) (if (eq? ret miss) elseval ret)))) @@ -284,7 +284,7 @@ (let ((elseval (match l (() None) ((v) v)))) - (let ((ret (ref (slot-ref o 't) k miss))) + (let ((ret (py-hash-ref (slot-ref o 't) k miss))) (if (eq? ret miss) elseval ret))))) @@ -545,29 +545,40 @@ (define <dict> `(,<py-hashtable> . _)) -(define dict-set! (resolve-method-g pylist-set! <dict>)) -(define dict-ref (resolve-method-g pylist-ref <dict>)) -(define dict-del! (resolve-method-g pylist-delete! <dict>)) -(define dict-pop! (resolve-method-g pylist-pop! <dict>)) -(define dict-clear! (resolve-method-g py-clear <dict>)) -(define dict-get (resolve-method-g py-get <dict>)) -(define dict-len (resolve-method-g len <dict>)) -(define dict-bool (resolve-method-g bool <dict>)) - - -(define-python-class dict (<py-hashtable>) +(define <in> `(,<top> ,<py-hashtable>)) +(define (resolve a b) (object-method (resolve-method-g a b))) +(define dict-set! (resolve pylist-set! <dict>)) +(define dict-ref (resolve pylist-ref <dict>)) +(define dict-del! (resolve pylist-delete! <dict>)) +(define dict-pop! (resolve pylist-pop! <dict>)) +(define dict-clear! (resolve py-clear <dict>)) +(define dict-get (resolve py-get <dict>)) +(define dict-len (resolve len <dict>)) +(define dict-bool (resolve bool <dict>)) +(define dict-in (resolve in <in> )) +(define dict-items (resolve py-items <dict>)) + +(define-python-class dict (<py> <py-hashtable>) (define __getitem__ dict-ref) - (define __setitem__ dict-set!) + (define __setitem__ + (lambda (self key val) + (dict-set! self key val))) (define __delitem__ dict-del!) (define pop dict-pop!) (define clear dict-clear!) (define get dict-get) (define __len__ dict-len) (define __bool__ dict-bool) + (define items dict-items) + (define __iter__ (lambda (self) + (wrap-in (slot-ref self 't)))) + (define __contains__ + (lambda (self x) (dict-in x self))) (define __format___ (lambda x #f)) (define __setattr__ (@@ (oop pf-objects) __setattr__)) (define __getattribute__ (@@ (oop pf-objects) __getattribute__)) - + + (define __init__ (letrec ((__init__ (case-lambda @@ -591,7 +602,71 @@ __init__))) -(define-python-class weak-key-dict (<py-hashtable>) +(define (norm k) + (if (symbol? k) + (symbol->string k) + k)) + +(define fail (list 'fail)) + +(define-python-class dictNs () + (define __getitem__ + (lambda (self k) + (pylist-ref (ref self '_dict) (norm k)))) + + (define __setitem__ + (lambda (self k v) + (pylist-set! (ref self '_dict) (norm k) v))) + + (define __iter__ + (lambda (self) + (wrap-in (ref self '_dict)))) + + (define pop + (lambda (self k . l) + (apply pylist-pop! (ref self '_dict) (norm k) l))) + + (define clear + (lambda (self) + (py-clear (ref self '_dict)))) + + (define get + (lambda (self key . l) + (apply py-get (ref self '_dict) (norm key) l))) + + (define __len__ + (lambda (self) + (len (ref self '_dict)))) + + (define __bool__ + (lambda (self) + (bool (ref self '_dict)))) + + (define __contains__ + (lambda (self x) + (in (norm x) (ref self '_dict)))) + + (define items + (lambda (self) + (py-items (ref self '_dict)))) + + (define __repr__ + (lambda (self) + (format #f "Ns:~a" (ref (ref self '_dict) '__name__)))) + + (define __getattr__ + (lambda (self key) + (let ((r (ref (ref self '_dict) key fail))) + (if (eq? r fail) + (raise (AttributeError key)) + r)))) + + (define __init__ + (lambda (self d) (set self '_dict d)))) + +(set! (@@ (oop pf-objects) dictNs) dictNs) + +(define-python-class weak-key-dict (<py> <py-hashtable>) (define __init__ (letrec ((__init__ (case-lambda @@ -610,7 +685,7 @@ (slot-ref x 't))))))) __init__))) -(define-python-class weak-value-dict (<py-hashtable>) +(define-python-class weak-value-dict (<py> <py-hashtable>) (define __init__ (letrec ((__init__ (case-lambda @@ -647,6 +722,10 @@ (pylist-sort! l) l)) - +(set! (@@ (oop pf-objects) hash-for-each*) + (lambda (f dict) + (for ((k v : dict)) () + (f k v)))) + (define-method (py-class (o <hashtable>)) dict) (define-method (py-class (o <py-hashtable>)) dict) |