samer@4: % lazy - Lazy evaluator, or memoiser samer@4: % samer@4: % lazy :: (unit -> A) -> (unit -> A). samer@4: % lazy :: (unit -> action A) -> (unit -> action A). samer@4: % samer@4: % If x=lazy(f), then f is not called until x is samer@4: % called. Then x() returns x1=f(). Thereafter, samer@4: % x() returns x1 and f is never called again. samer@4: % samer@4: % Eg, let x=lazy(@()rand). samer@4: % Then x() returns the same random number each samer@4: % time it is called. samer@4: function f=lazy(thunk) samer@4: value=thunk; samer@4: evalled=false; samer@4: f=@get; samer@4: samer@4: function v=get, samer@4: if evalled, samer@4: v=value; samer@4: else samer@4: value=thunk(); samer@4: evalled=true; samer@4: v=value; samer@4: end samer@4: end samer@4: end