summaryrefslogtreecommitdiff
path: root/modules/language/python/dict.scm
diff options
context:
space:
mode:
Diffstat (limited to 'modules/language/python/dict.scm')
-rw-r--r--modules/language/python/dict.scm117
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)