aboutsummaryrefslogtreecommitdiffstats
path: root/csc/hash-map.csc
diff options
context:
space:
mode:
authorRose Hogenson <rhogenson@posteo.net>2022-01-14 21:06:26 -0800
committerRose Hogenson <rhogenson@posteo.net>2022-01-14 21:06:26 -0800
commita968e8595b999d5c0a43c59de69bcb4f34e205c1 (patch)
tree248ee958532eaaa07ed32c58a8dc3d3709ce9afc /csc/hash-map.csc
parent85a1d8d269383cc061d54cf4e1af0254a6c6ccb7 (diff)
downloadchromatopelma-a968e8595b999d5c0a43c59de69bcb4f34e205c1.tar.zst
Write a first draft macro expander.
Committing it because it compiles. I have to write tests and debug it still.
Diffstat (limited to 'csc/hash-map.csc')
-rw-r--r--csc/hash-map.csc31
1 files changed, 25 insertions, 6 deletions
diff --git a/csc/hash-map.csc b/csc/hash-map.csc
index 2862e84..81ed770 100644
--- a/csc/hash-map.csc
+++ b/csc/hash-map.csc
@@ -1,16 +1,18 @@
(define-library (csc hash-map)
(export
alist->map
- hash-bytevector
- map->alist
for-each
+ hash-bytevector
insert
+ key-not-found-error?
lookup
+ make-map
+ map->alist
map?
- key-not-found-error?
- make-map)
+ merge)
(import (scheme base)
- (only (csc format) sprintf))
+ (only (csc format) sprintf)
+ (only (csc match) match))
(begin
@@ -255,4 +257,21 @@
(hash 0))
(if (>= i (bytevector-length b))
hash
- (loop (+ 1 i) (+ (* hash #x100) (bytevector-u8-ref b i))))))))
+ (loop (+ 1 i) (+ (* hash #x100) (bytevector-u8-ref b i))))))
+
+
+ (define (merge2 m1 m2)
+ (let ((m1 m1))
+ (for-each
+ (lambda (k v)
+ (set! m1 (insert m1 k v)))
+ m2)
+ m1))
+
+
+ (define (merge m . m*)
+ (let loop ((m* m*)
+ (m m))
+ (match m*
+ ('() m)
+ ((head . tail) (loop tail (merge2 m head))))))))