lazy-lists: seperate lazy-list and promise types so promises of standard lists work properly
parent
90d8b67ff0
commit
85adc51294
|
@ -7,6 +7,12 @@
|
||||||
USING: kernel sequences math vectors arrays namespaces generic errors ;
|
USING: kernel sequences math vectors arrays namespaces generic errors ;
|
||||||
IN: lazy-lists
|
IN: lazy-lists
|
||||||
|
|
||||||
|
! Lazy List Protocol
|
||||||
|
GENERIC: car ( cons -- car )
|
||||||
|
GENERIC: cdr ( cons -- cdr )
|
||||||
|
GENERIC: nil? ( cons -- bool )
|
||||||
|
GENERIC: list? ( object -- bool )
|
||||||
|
|
||||||
TUPLE: promise quot forced? value ;
|
TUPLE: promise quot forced? value ;
|
||||||
|
|
||||||
C: promise ( quot -- promise ) [ set-promise-quot ] keep ;
|
C: promise ( quot -- promise ) [ set-promise-quot ] keep ;
|
||||||
|
@ -21,11 +27,19 @@ C: promise ( quot -- promise ) [ set-promise-quot ] keep ;
|
||||||
] unless
|
] unless
|
||||||
promise-value ;
|
promise-value ;
|
||||||
|
|
||||||
|
M: promise car ( promise -- car )
|
||||||
|
force car ;
|
||||||
|
|
||||||
|
M: promise cdr ( promise -- cdr )
|
||||||
|
force cdr ;
|
||||||
|
|
||||||
|
M: promise nil? ( cons -- bool )
|
||||||
|
force nil? ;
|
||||||
|
|
||||||
|
M: promise list? ( object -- bool )
|
||||||
|
drop t ;
|
||||||
|
|
||||||
TUPLE: cons car cdr ;
|
TUPLE: cons car cdr ;
|
||||||
GENERIC: car ( cons -- car )
|
|
||||||
GENERIC: cdr ( cons -- cdr )
|
|
||||||
GENERIC: nil? ( cons -- bool )
|
|
||||||
GENERIC: list? ( object -- bool )
|
|
||||||
|
|
||||||
M: object list? ( object -- bool )
|
M: object list? ( object -- bool )
|
||||||
drop f ;
|
drop f ;
|
||||||
|
@ -62,20 +76,22 @@ M: cons list? ( object -- bool )
|
||||||
nil <cons> <cons> <cons> ;
|
nil <cons> <cons> <cons> ;
|
||||||
|
|
||||||
! Both 'car' and 'cdr' are promises
|
! Both 'car' and 'cdr' are promises
|
||||||
|
TUPLE: lazy-cons car cdr ;
|
||||||
|
|
||||||
: lazy-cons ( car cdr -- promise )
|
: lazy-cons ( car cdr -- promise )
|
||||||
>r <promise> r> <promise> <cons>
|
>r <promise> r> <promise> <lazy-cons>
|
||||||
T{ promise f f t f } clone [ set-promise-value ] keep ;
|
T{ promise f f t f } clone [ set-promise-value ] keep ;
|
||||||
|
|
||||||
M: promise car ( promise -- car )
|
M: lazy-cons car ( lazy-cons -- car )
|
||||||
force car force ;
|
lazy-cons-car force ;
|
||||||
|
|
||||||
M: promise cdr ( promise -- cdr )
|
M: lazy-cons cdr ( lazy-cons -- cdr )
|
||||||
force cdr force ;
|
lazy-cons-cdr force ;
|
||||||
|
|
||||||
M: promise nil? ( cons -- bool )
|
M: lazy-cons nil? ( lazy-cons -- bool )
|
||||||
force nil? ;
|
nil eq? ;
|
||||||
|
|
||||||
M: promise list? ( object -- bool )
|
M: lazy-cons list? ( object -- bool )
|
||||||
drop t ;
|
drop t ;
|
||||||
|
|
||||||
DEFER: lunit
|
DEFER: lunit
|
||||||
|
|
Loading…
Reference in New Issue