|
Class: LazyCons
Object
|
+--Collection
|
+--SequenceableCollection
|
+--Cons
|
+--LazyCons
- Package:
- stx:libbasic2
- Category:
- Collections-Linked
- Version:
- rev:
1.10
date: 2021/01/20 14:03:33
- user: cg
- file: LazyCons.st directory: libbasic2
- module: stx stc-classLibrary: libbasic2
This is an experimental (academic ?) goody for demonstration purposes.
A pair with lazy evaluation of the tail.
Useful to implement infinite lists as possible in lazy functional languages.
copyrightCOPYRIGHT (c) 2003 by Claus Gittinger
All Rights Reserved
This software is furnished under a license and may be used
only in accordance with the terms of that license and with the
inclusion of the above copyright notice. This software may not
be provided or otherwise made available to, or used by, any
other person. No title to or ownership of the software is
hereby transferred.
accessing-basic
-
cdr
-
return the tail, second or cdr - whatever you wonna call it.
Here, the tail is evaluated.
This makes me a non-lazy cons.
-
isLazyValue
-
allNumbers represents an infinite list (1..)
|gen allNumbers|
gen := [:n | LazyCons car:n cdr:[ gen value:n+1 ]].
allNumbers := gen value:1.
allNumbers head.
allNumbers tail head.
allNumbers tail tail head.
|
sieve
|gen filter sieve primeNumberList|
gen := [:n | LazyCons car:n cdr:[ gen value:n+1 ]].
filter := [:n :l |
|head rest|
head := l car.
rest := l cdr.
(head \\ n) ~~ 0 ifTrue:[
LazyCons car:head cdr:[ filter value:n value:rest ].
] ifFalse:[
filter value:n value:rest.
]
].
sieve := [:l |
|prime rest|
prime := l car.
rest := l cdr.
LazyCons car:prime cdr:[ sieve value:(filter value:prime value:rest) ]
].
primeNumberList := sieve value:(gen value:2).
primeNumberList
|
|