diff options
| author | Rose Hogenson <rhogenson@posteo.net> | 2022-01-14 21:06:26 -0800 |
|---|---|---|
| committer | Rose Hogenson <rhogenson@posteo.net> | 2022-01-14 21:06:26 -0800 |
| commit | a968e8595b999d5c0a43c59de69bcb4f34e205c1 (patch) | |
| tree | 248ee958532eaaa07ed32c58a8dc3d3709ce9afc /csc/hash-map.csc | |
| parent | 85a1d8d269383cc061d54cf4e1af0254a6c6ccb7 (diff) | |
| download | chromatopelma-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.csc | 31 |
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)))))))) |
