: packer ( seq -- quot )
length dup 4 <=
- [ { [ t ] [ ] [ 2array ] [ 3array ] [ 4array ] } nth ]
+ [ { [ f ] [ ] [ 2array ] [ 3array ] [ 4array ] } nth ]
[ { } [nsequence] ] if ;
: unpacker ( seq -- quot )
: make/0 ( table quot effect -- quot )
out>> [
packer '[
- _
- [ first-unsafe ]
- [ @ @ [ 0 rot set-nth-unsafe ] keep ] ?unless
+ _ dup first-unsafe dup null eq? [
+ drop @ @ [ 0 rot set-nth-unsafe ] keep
+ ] [ nip ] if
]
] keep unpacker compose ;
3tri ;
: define-memoized ( word quot effect -- )
- dup in>> length zero? [ f 1array ] [ H{ } clone ] if
+ dup in>> length zero? [ null 1array ] [ H{ } clone ] if
(define-memoized) ;
: define-identity-memoized ( word quot effect -- )
- dup in>> length zero? [ f 1array ] [ IH{ } clone ] if
+ dup in>> length zero? [ null 1array ] [ IH{ } clone ] if
(define-memoized) ;
PREDICATE: memoized < word "memoize" word-prop >boolean ;
bi ;
: memoize-quot ( quot effect -- memo-quot )
- dup in>> length zero? [ f 1array ] [ H{ } clone ] if
+ dup in>> length zero? [ null 1array ] [ H{ } clone ] if
-rot make-memoizer ;
: reset-memoized ( word -- )
"memoize" word-prop dup sequence?
- [ f swap set-first ] [ clear-assoc ] if ;
+ [ null swap set-first ] [ clear-assoc ] if ;
: invalidate-memoized ( inputs... word -- )
[ stack-effect in>> packer call ]
[
"memoize" word-prop dup sequence?
- [ f swap set-first ] [ delete-at ] if
+ [ null swap set-first ] [ delete-at ] if
]
bi ;