There are some bugs in the semantics. I try to fix them here
Consider
* k, the r5rs continuation
* dynamic-wind, r5rs dynamic wind with the addition that continuation
k is an argument
to the rewinder.
Introduce (with-special ((a:id kind:object) ...) code ...) and
(set~ a:id v:obj)
Introduce
(special-set! i k value)
(special-ref i k)
A setter and a getter of an object indexed by i and k
Also define
(guard-special? k kind)
That index an object on k, wich depedning on kind ask to restore the value
of the old saved state.
Let (make-id) generate a unique object
Then the semantic for with-special in guard mode would be
(let ((last #f)
(i (make-id)))
(dynamic-wind
(lambda (k)
(set! last #f)
(when (guard-special? k kind)
(set! a (special-ref i k))))
(lambda ()
(call-with-values (lambda () (begin code ...))
(lambda ret
(set! last #t)
(apply values ret))))
(lambda (k . l)
(unless last
(special-set! i k a))))
Guard mode is entered only if a is referenced with set~ and never with
set! if it can be proved
Otherwise guard mode is never entered. The semantics of set~ is the
same as with set! otherwise.
if with-special is not in guard-mode then it behaves just as (let ()
code ....)
Hope that I don't spam the list but guile is a cooperative effort.
/Stefan