Scheme's
call/cc
provides a flexible way to control execution flow. Its flexibility allows for different approaches to implementing unwind-protect
. Dorai Sitaram's "Unwind-Protect in Portable Scheme" shows a portable implementation of
unwind-protect
. It does so by constricting the flexibility of call/cc
. User would have to specify when to call the unwindforms
part of unwind-protect
. In certain situations, it is desirable to have this level of control. In others, it would be akin to having to manually manage memory allocation. The other approach is having an automatically executed
unwindforms
such as the one described by Taylor R. Campbell, "2006-05-01 On control brackets and resource release". Having the system manages the execution of unwindforms
is more in line to traditional implementations of unwind-protect
in other languages. It is this approach that interests me. By associating a
protector cell
to the bodyform
, we can rely on the GC mechanism cleaning up the protector cell once =bodyform='s continuation is no longer reachable. If it is no longer reachable, then it is safe to execute the unwindforms
. He also describes an optimisation of a common case where =bodyform='s continuation is never reified. Without it, there is only one =bodyform='s continuation and once the execution passes through the end of
bodyform
, it is safe to continue to unwindforms
. In his 'blog', he provides a sample implementation for MIT-Scheme. The implementation would have to be platform-specific since it hooks into the GC. However, it is easy to port that to other platform.
An Implementation in SISC
As a user of SISC, and as someone who has seen many applications (including SISCWeb) usingdynamic-wind
as a poor-man's unwind-protect
, having a system-managed unwind-protect
in SISC is a good idea. As I was not aware of any existing implementation, I proceeded to create one using Taylor Campbell's example as the starting point. To hook into Java's GC finalisation process, I used
GCHook.java. Then unwind-protect.scm implements the rest.
unwind-protect-in-sisc
(originally from http://microjet.ath.cx/WebWiki/2006.10.24_UnwindProtectInSISC.html and http://microjet.ath.cx/WebWiki/2006.10.27_UnwindProtectInSISCPart2.html)