[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
dynamic-wind vs. call/cc [Was: DYNAMIC-WIND vs. multi-processing]
Date: Mon, 10 May 93 10:57:30 -0400
From: Aubrey Jaffer <email@example.com>
Before DYNAMIC-WIND was incorporated into R5RS, process switching
could be trivially implemented using CALL-WITH-CURRENT-CONTINUATION.
Except for top-level variables, CALL-WITH-CURRENT-CONTINUATION
captured the whole state of a computation.
With DYNAMIC-WIND, state is alterred when a continuation is called
which is outside its dynamic scope (for instance to a separate
computation). This means that a separate primitive construct will be
needed in order to implement process switching in R5RS Scheme.
Alternately, one might say that users should just avoid the use of
DYNAMIC-WIND if they want to multi-process. But does the user really
have control over all uses of DYNAMIC-WIND? A library or
implementation defined function might use it and the user would be
unaware. CALL-WITH-INPUT-FILE and CALL-WITH-OUTPUT-FILE are
"continuation unsafe" in R4RS Scheme. Are there others?
Yes, yes, yes! I agree wholeheartedly! I really don't think that
dynamic-wind is a good idea. IMHO, it even conflicts with the concept
of the ``current continuation''.
The continuation of ``(+ a b)'' in ``(* (+ a b) c)'' is simply to
multiply the result by ``c'' and NOT to do some other cleanup work first!
Either we would have to rename ``call-with-current-continuation'' to
something else or ``dynamic-wind'' should leave it alone and only affect
some higher construct (which can be built on top of call/cc).
The term ``continuation'' has a certain meaning in denotational semantics
and I would prefer call/cc to capture something equivalent to it.