eXept Software AG Logo

Smalltalk/X Webserver

Documentation of class 'Lazy':

Home

Documentation
www.exept.de
Everywhere
for:
[back]

Class: Lazy


Inheritance:

   ProtoObject
   |
   +--Lazy

Package:
stx:libbasic2
Category:
Kernel-Processes
Version:
rev: 1.19 date: 2021/01/20 15:56:36
user: cg
file: Lazy.st directory: libbasic2
module: stx stc-classLibrary: libbasic2

Description:


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.

copyright

This is a Manchester Goodie protected by copyright. These conditions are imposed on the whole Goodie, and on any significant part of it which is separately transmitted or stored: * You must ensure that every copy includes this notice, and that source and author(s) of the material are acknowledged. * These conditions must be imposed on anyone who receives a copy. * The material shall not be used for commercial gain without the prior written consent of the author(s). Further information on the copyright conditions may be obtained by sending electronic mail: To: goodies-lib@cs.man.ac.uk Subject: copyright or by writing to The Smalltalk Goodies Library Manager, Dept of Computer Science, The University, Manchester M13 9PL, UK (C) Copyright 1992 University of Manchester For more information about the Manchester Goodies Library (from which this file was distributed) send e-mail: To: goodies-lib@cs.man.ac.uk Subject: help

Instance protocol:

evaluating
o  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.

o  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.

o  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.

o  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.

o  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
o  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).

o  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
o  _evaluate_
answer the computed value

o  doesNotUnderstand: aMessage
Any message to a Lazy will end up here.

o  perform: aSelector withArguments: argArray
send the message aSelector with all args taken from argArray
to the receiver.

testing
o  isLazyValue
true if I have no value yet
(i.e. would block when sending me a message)


Examples:


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.


ST/X 7.7.0.0; WebServer 1.702 at 20f6060372b9.unknown:8081; Sat, 27 Jul 2024 04:34:23 GMT