|
Class: LazyValue
ProtoObject
|
+--LazyValue
- Package:
- stx:libbasic2
- Category:
- Kernel-Processes
- Version:
- rev:
1.13
date: 2019/06/25 09:06:22
- user: cg
- file: LazyValue.st directory: libbasic2
- module: stx stc-classLibrary: libbasic2
- Author:
- Claus Gittinger
I represent an expression which might not be needed.
Any messages sent to me will force the evaluation (once).
The value is remembered.
Can be used to simulate non-strict programming languages.
Block
Future
Lazy
instance creation
-
block: aBlock
-
return a new lazyValue, which computes aBlock
printing
-
displayOn: aGCOrStream
-
notice: displayString and displayOn: will not wait for the value (they are for developers and inspectors),
whereas printString and printOn: will wait (they are for the program to print data).
-
displayString
-
notice: displayString and displayOn: will not wait for the value (they are for developers and inspectors),
whereas printString and printOn: will wait (they are for the program to print data).
private access
-
block: aBlock
-
queries
-
class
-
synchronising
-
_evaluate_
-
ensure that block is only executed once
-
doesNotUnderstand: aMessage
-
enable debugging / inspecting without evaluating
-
perform: aSelector withArguments: argArray
-
send the message aSelector with all args taken from argArray
to the receiver.
testing
-
isBehavior
-
-
isLazyValue
-
|x|
x := LazyValue block:[ Transcript flash. 1234 ].
Delay waitForSeconds:4.
Transcript showCR:x printString
|
listFrom:n - an infinite list of integers starting with n
|gen infiniteList|
gen := [:n |
Cons
car:n
cdr:( LazyValue block:[gen value:n+1] )
].
infiniteList := gen value:1.
1 to:10 do:[:i |
Transcript showCR:infiniteList car.
infiniteList := infiniteList cdr.
].
|
filterOdd:l - an infinite list filtering odd numbers from another list
|gen infiniteList genOdd infiniteOdd|
gen := [:n |
Cons
car:n
cdr:( LazyValue block:[gen value:n+1] )
].
infiniteList := gen value:1.
genOdd := [:l |
|lR el|
lR := l.
[ el := lR car. lR := lR cdr. el odd ] whileFalse:[].
Cons
car:el
cdr:( LazyValue block:[genOdd value:lR] )
].
infiniteOdd := genOdd value:infiniteList.
1 to:10 do:[:i |
Transcript showCR:infiniteOdd car.
infiniteOdd := infiniteOdd cdr.
].
|
powersOf:n - an infinite list of powers of n
|genPowersOf infiniteListOfPowers|
genPowersOf := [:base |
|powersOfBase|
powersOfBase :=
[:n |
Cons
car:n
cdr:( LazyValue block:[powersOfBase value:n*base] )
].
powersOfBase value:1.
].
infiniteListOfPowers := genPowersOf value:2.
1 to:10 do:[:i |
Transcript showCR:infiniteListOfPowers car.
infiniteListOfPowers := infiniteListOfPowers cdr.
].
|
merge2:a _:b - merge 2 lists.
|genMerge2 l gen infiniteList genOdd infiniteOdd genEven infiniteEven genMerge|
gen := [:n |
Cons
car:n
cdr:( LazyValue block:[gen value:n+1] )
].
infiniteList := gen value:1.
genOdd := [:l |
|lR el|
lR := l.
[ el := lR car. lR := lR cdr. el odd ] whileFalse:[].
Cons
car:el
cdr:( LazyValue block:[genOdd value:lR] )
].
infiniteOdd := genOdd value:infiniteList.
genEven := [:l |
|lR el|
lR := l.
[ el := lR car. lR := lR cdr. el even ] whileFalse:[].
Cons
car:el
cdr:( LazyValue block:[genEven value:lR] )
].
infiniteEven := genEven value:infiniteList.
genMerge2 := [:a :b |
|nextA nextB|
nextA := a car.
nextB := b car.
nextA < nextB ifTrue:[
Cons
car:nextA
cdr:( LazyValue block:[genMerge2 value:(a cdr) value:b] )
] ifFalse:[
Cons
car:nextB
cdr:( LazyValue block:[genMerge2 value:a value:(b cdr)] )
].
].
l := genMerge2 value:infiniteOdd value:infiniteEven.
1 to:10 do:[:i |
Transcript showCR:l car.
l := l cdr.
].
|
|