summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Sima <ben@bsima.me>2020-05-11 15:15:37 -0700
committerBen Sima <ben@bsima.me>2020-05-11 15:15:37 -0700
commit7f5a5970c8e8625870679e449b2e91a5cb3c6afc (patch)
tree94262a9c2efb51da6895dde96efaa110b6cea432
parent57952327433f34324da6db9789fb7c1ed5204b5f (diff)
Add dict library
-rw-r--r--dict.scm50
1 files changed, 50 insertions, 0 deletions
diff --git a/dict.scm b/dict.scm
new file mode 100644
index 0000000..564b1ae
--- /dev/null
+++ b/dict.scm
@@ -0,0 +1,50 @@
+#!r6rs
+;; Experimental python-like dictionary. Import this qualified, eg:
+;; (import (prefix (dict) dict/))
+;; or
+;; (import (prefix (dict) dict.))
+(library (dict (2))
+ (export
+ empty new dict dict? keys vals contains?
+ set get del update map)
+ (import
+ (rnrs base)
+ (srfi srfi-69))
+
+ (define (empty)
+ (make-hash-table))
+
+ (define (new tuples)
+ (let ([dict (make-hash-table)])
+ (map (lambda (k . v) (hash-table-set! dict k v)) tuples)
+ dict))
+
+ (define (dict? dict)
+ (hash-table? dict))
+
+ (define (keys dict)
+ (hash-table-keys dict))
+
+ (define (vals dict)
+ (hash-table-values dict))
+
+ (define (len dict)
+ (hash-table-size dict))
+
+ (define (contains? dict key)
+ (hash-table-exists? dict key))
+
+ (define (set dict key value)
+ (hash-table-set! dict key value))
+
+ (define (get dict key)
+ (hash-table-ref dict key #f))
+
+ (define (del dict key)
+ (hash-table-delete! dict key))
+
+ (define (update dict key func)
+ (hash-table-update! dict key func (lambda () '())))
+
+ (define (map func dict)
+ (hash-table-walk dict func)))