Added destructuring lambda/rec-lambda, changed let to use the same [] array destructuring syntax, added basic multiset & set-foldl. Fixed a bunch of bugs in fungll, hopefully close to working, but just realized that < is only defined for ints, while it's how the RB-Tree set/map sort their values/keys, so I'll need to extend it like = for all types. Tomorrow!
This commit is contained in:
17
rb.kp
17
rb.kp
@@ -20,6 +20,10 @@
|
||||
~E 0
|
||||
[c a x b] (+ 1 (recurse a) (recurse b))))
|
||||
|
||||
generic-foldl (rec-lambda recurse (f z t) (match t
|
||||
~E z
|
||||
[c a x b] (recurse f (f (recurse f z a) x) b)))
|
||||
|
||||
generic-contains? (rec-lambda recurse (t cmp v found not-found) (match t
|
||||
~E (not-found)
|
||||
[c a x b] (match (cmp v x) '< (recurse a cmp v found not-found)
|
||||
@@ -87,15 +91,17 @@
|
||||
['B ~E x ~E] (match (cmp v x) '= EE
|
||||
_ t)
|
||||
[c a x b] (match (cmp v x) '< (rotate [c (del a v) x b])
|
||||
'= (let ((vp bp) (min_delete b))
|
||||
'= (let ([vp bp] (min_delete b))
|
||||
(rotate [c a vp bp]))
|
||||
'> (rotate [c a x (del b v)]))))
|
||||
) (del (redden t) v)))
|
||||
|
||||
|
||||
set-cmp (lambda (a b) (cond (< a b) '<
|
||||
(= a b) '=
|
||||
true '>))
|
||||
set-empty empty
|
||||
set-foldl generic-foldl
|
||||
set-insert (lambda (t x) (generic-insert t set-cmp x false))
|
||||
set-contains? (lambda (t x) (generic-contains? t set-cmp x (lambda (f) true) (lambda () false)))
|
||||
set-remove (lambda (t x) (generic-delete t set-cmp x))
|
||||
@@ -112,8 +118,15 @@
|
||||
map-get-or-default (lambda (t k d) (generic-contains? t map-cmp [k nil] (lambda (f) (idx f 1)) (lambda () d)))
|
||||
map-get-with-default (lambda (t k d) (generic-contains? t map-cmp [k nil] (lambda (f) (idx f 1)) (lambda () (d))))
|
||||
map-remove (lambda (t k) (generic-delete t map-cmp [k nil]))
|
||||
|
||||
; This could be 2x as efficent by being implmented on generic instead of map,
|
||||
; as we wouldn't have to traverse once to find and once to insert
|
||||
multimap-empty map-empty
|
||||
multimap-insert (lambda (t k v) (map-insert t k (set-insert (map-get-or-default t k set-empty) v)))
|
||||
multimap-get (lambda (t k) (map-get-or-default t k set-empty))
|
||||
)
|
||||
(provide set-empty set-insert set-contains? set-remove
|
||||
(provide set-empty set-foldl set-insert set-contains? set-remove
|
||||
map-empty map-insert map-contains-key? map-get map-get-or-default map-get-with-default map-remove
|
||||
multimap-empty multimap-insert multimap-get
|
||||
size)
|
||||
))
|
||||
|
||||
Reference in New Issue
Block a user