|
Class: LazyCons
Object
|
+--Collection
|
+--SequenceableCollection
|
+--Cons
|
+--LazyCons
- Package:
- stx:libbasic2
- Category:
- Collections-Linked
- Version:
- rev:
1.9
date: 2017/11/28 18:16:01
- user: cg
- file: LazyCons.st directory: libbasic2
- module: stx stc-classLibrary: libbasic2
- Author:
- Claus Gittinger (Jun 2003)
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.
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
|
|