Email list hosting service & mailing list manager

Re: strict promises? Andre van Tonder 27 Feb 2004 14:34 UTC

On Sat, 31 Jan 2004 wrote:

> I just found myself wanting to create a promise, but not to delay its
> evaluation.  I could do
>   (let ((p (delay <expression>)))
>     (force p)
>     p)
> but that would needlessly compute and complicate.  STRICT would do just
> what I want.  Why was STRICT not provided in the first place, in fact?

OK, I'm convinced now that it is a good thing to add STRICT for this
need, which is actually quite common.  I would like to change its name,
though. Since it has the same type signature as delay, I propose to use
the verb RELAY (= passing along something, in this case a value wrapped in
a promise).  So we have

  delay : a -> Promise a : wraps its unevaluated argument in a promise
  relay : a -> Promise a : wraps its   evaluated argument in a promise

The semantics is observationally equivalent to

  (relay exp) = (let ((x exp)) (delay exp))

but it admits a more efficient implementation (no superfluous thunk
creation and evaluation).

Unless there are strong objections, I will include this in the document as
soon as I have time.