[comp.lang.scheme] Clarification to force needed

shap@POLYA.STANFORD.EDU (Jonathan S. Shapiro) (04/08/89)

I am sending this to both lists, though I don't know if this is a
problem in the ANSI spec.

I believe that the current definition of (force <promise>) could use
some rewording to make it clear that FORCE is only entitled to memoize
when the promise has returned.  That is, the sequence:

	(set! expr (delay (if get-out (escape^ #f) #t)))
	(call/cc (lambda (cont)
                   (set! escape! cont)
		   (set! escape #t)
		   (force expr)))
        (set! escape #f)
	(force expr)

A problem can arise if forces change their type codes too early.  The
intent is that if executing a force succeeds everything is fine, but
that one is entitled to restart a force that has been thrown out of.
My intent is also that 

     (set! fred (delay (begin ... (force blah) (throw...))))
     (force fred)

is entitled to memoize blah if it succeeds, even if the overall delay
FRED is thrown from.

I believe this was the original intent, but it would be useful to make
the behavior outlined above explicitly correct in the standard.

Jon Shapiro
Stanford University