2020-02-20 12:43:52 +03:00
|
|
|
-- Lazy.
|
|
|
|
|
-- (C) Dmitry Boulytchev, JetBrains Research, St. Petersburg State University, 2020
|
|
|
|
|
--
|
|
|
|
|
-- Deferred computations.
|
|
|
|
|
|
2020-02-14 08:13:52 +03:00
|
|
|
public fun makeLazy (f) {
|
2021-01-31 22:25:31 +03:00
|
|
|
var value, set = false;
|
2020-01-20 03:38:43 +03:00
|
|
|
|
|
|
|
|
fun () {
|
2020-02-15 22:58:43 +03:00
|
|
|
if set
|
|
|
|
|
then value
|
2020-02-20 12:43:52 +03:00
|
|
|
else
|
2021-01-31 22:25:31 +03:00
|
|
|
var c; -- need this temporary since in value := f () value would
|
2020-02-20 12:43:52 +03:00
|
|
|
-- create an intermediate managed pointer
|
|
|
|
|
set := true;
|
|
|
|
|
c := f ();
|
|
|
|
|
value := c;
|
|
|
|
|
c
|
2020-02-15 22:58:43 +03:00
|
|
|
fi
|
2020-01-20 03:38:43 +03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public fun force (f) {
|
|
|
|
|
f ()
|
|
|
|
|
}
|