|
Class: Lazy
ProtoObject
|
+--Lazy
- Package:
- stx:libbasic2
- Category:
- Kernel-Processes
- Version:
- rev:
1.17
date: 2019/06/25 09:09:04
- user: cg
- file: Lazy.st directory: libbasic2
- module: stx stc-classLibrary: libbasic2
- Author:
- tph@cs.man.ac.uk
I represent an execution which may or may not be required.
I will not start execution until at least one message has been received.
The messages sent to me are delayed until execution has completed.
Block
LazyValue
Future
evaluating
-
block: aBlock
-
Execute aBlock in parallel, but ensure that any messages sent
to me before execution of the block has terminated are
suspended until it has terminated. Do not start the evaluation
until at least one message has been sent to the receiver.
-
block: aBlock value: aValue
-
Execute aBlock in parallel, but ensure that any messages sent
to me before execution of the block has terminated are
suspended until it has terminated. Do not start the evaluation
until at least one message has been sent to the receiver.
-
block: aBlock value: value1 value: value2
-
Execute aBlock in parallel, but ensure that any messages sent
to me before execution of the block has terminated are
suspended until it has terminated. Do not start the evaluation
until at least one message has been sent to the receiver.
-
block: aBlock value: value1 value: value2 value: value3
-
Execute aBlock in parallel, but ensure that any messages sent
to me before execution of the block has terminated are
suspended until it has terminated. Do not start the evaluation
until at least one message has been sent to the receiver.
-
block: aBlock valueWithArguments: anArray
-
Execute aBlock in parallel, but ensure that any messages sent
to me before execution of the block has terminated are
suspended until it has terminated. Do not start the evaluation
until at least one message has been sent to the receiver.
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).
synchronising
-
_evaluate_
-
answer the computed value
-
doesNotUnderstand: aMessage
-
Any message to a Lazy will end up here.
-
perform: aSelector withArguments: argArray
-
send the message aSelector with all args taken from argArray
to the receiver.
testing
-
isLazyValue
-
true if I have no value yet
(i.e. would block when sending me a message)
Evaluates the factorial, starting only when the
result is actually required (when printString is sent).
| fac |
fac := [100 factorial] lazyValue.
Transcript showCR: 'Doing nothing. '.
(Delay forSeconds: 2) wait.
Transcript showCR: fac printString.
|
Starts evaluating both factorials only when required (by the value),
and waits until both blocks have finished before continuing.
| fac1 fac2 |
fac1 := [Transcript showCR: 'Starting fac1.. '. 100 factorial] lazyValue.
fac2 := [Transcript showCR: 'Starting fac2.. '. 120 factorial] lazyValue.
fac2 value.
fac1 value.
Transcript showCR: 'both completed.'.
|
Demonstrates how to pass arguments to a lazy evaluation block.
| temp |
temp := [:x :y :z | x * y * z] lazyValueWithArguments: #(2 3 4).
Transcript showCR: temp printString.
|
|