This is the mail archive of the kawa@sourceware.org mailing list for the Kawa project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: consecutive 'let


On Wed, 2007-12-26 at 17:55 -0500, Jake Miles wrote:
> I've never understood why
> dynamic-wind includes a 'before' function - maybe someone can
> enlighten me.

(define-syntax special-let
  (lambda (stx)
    (syntax-case stx ()
      ((special-let ((?var ?val) ...) ?body ...)
       (let-syntax ((?old ...) (generate-temporaries (syntax (?var ...))))
	 (syntax (let ((?old ?var) ...)
		   (set! ?var ?val) ...
		   (dynamic-wind values	;ignore
		     (lambda () ?body ...)
		     (lambda () (set! ?var ?old) ...)))))))))

(let ((reenter-special-let #f) (myvar 42))
  (display myvar)
  (special-let ((myvar 21))
    (call/cc (cut set! reenter-special-let <>)))
  (display myvar)
  (set! myvar "never displayed")
  (reenter-special-let))

Anyone would expect "never displayed" to be displayed forever after 42
is displayed twice.  Instead 42 is displayed forever.

`special-let' can only be implemented correctly with the "before" thunk.
This is a specific example of the general problem of controlling dynamic
wind in the face of multiply-restartable continuations.

Returning to the thread's topic, for a full `time-process'
implementation that counts all execution in the dynamic context of
`process', the thunks must be altered to handle restarting.  This
doesn't matter for Kawa, but should be noted if you might want to port
this code later.

-- 
The foremost obstacle standing in the way of the public's acceptance of
evolutionary theory is not a dearth of common sense. Instead, it is the
public's erroneous belief that common sense is a dependable guide to
evaluating the natural world.  --Scott O. Lilienfeld, SkI 5/2006

Attachment: signature.asc
Description: This is a digitally signed message part


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]