diff options
author | Ben Sima <ben@bsima.me> | 2020-05-11 15:15:37 -0700 |
---|---|---|
committer | Ben Sima <ben@bsima.me> | 2020-05-11 15:15:37 -0700 |
commit | 7f5a5970c8e8625870679e449b2e91a5cb3c6afc (patch) | |
tree | 94262a9c2efb51da6895dde96efaa110b6cea432 | |
parent | 57952327433f34324da6db9789fb7c1ed5204b5f (diff) |
Add dict library
-rw-r--r-- | dict.scm | 50 |
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))) |