The intent of `handle-evt' is that the handling procedure is called in tail position with respect to `sync'. That tail guarantee is not consistent with nesting.
We could tail that the handler is called in tail position only if it's not nested, but we normally use `handle-evt' in cases where tail behavior matters (e.g., a server loop), and we want to be notified when it can't work; unexpected non-tail behavior is too subtle a bug. If tail behavior doesn't matter, we use `warp-evt'. Returning a handle evt from a guard evt is a different kind of wrapping than putting a handle evt in a wrap evt. The unwrapping with a guard evt happens before the `sync', while wrap-evt unwrapping happens after. At Thu, 28 Mar 2013 16:28:38 +0100, Tobias Hammer wrote: > Thanks, that's clear now. > > Another question regarding events: Why is it forbidden to put a handle-evt > inside another handle- or wrap-evt? > I couldn't come up with a situation where this could cause trouble. > Especially as it is allowed to nest handle-evts if i put a guard-evt or a > struct with prop:evt in between. > > Tobias > > > > On Thu, 28 Mar 2013 16:17:00 +0100, Matthew Flatt <[email protected]> > wrote: > > > Sometimes, `sync' picks the first evt that it is given before even > > trying the second evt enough to call the evt-generating function. That > > is, `sync' looks far enough to see all arguments are `evt?', but > > calling the evt-generator part of a guard evt is part of the attempt to > > choose the specific guard evt, and that action doesn't happen if some > > other evt succeeds first. > > > > I'll work on the docs to clarify. > > > > Yes, `proc' should be `generator'. But, `generator' also should be > > changed, because "generator" now means something specific and > > different. > > > > At Thu, 28 Mar 2013 16:08:09 +0100, Tobias Hammer wrote: > >> Hi, > >> > >> i am trying to understand how nack-guard-evt works. Therefore i created > >> the appended test program. Sometimes it stops with the error message and > >> sometimes it prints the three values. It is clear to me what the error > >> means and why it is raised. > >> What i am not understanding is, why the nack generator is not run every > >> time sync is called. I would have expected from the docs that it is run > >> on > >> every sync. > >> Can someone clarify why my assumptions are wrong and how nack-guard-evt > >> is > >> expected to behave? > >> > >> Related question: The docs for the function talk abound 'proc', should > >> it > >> be 'generator'? > >> > >> Tobias > >> > >> > >> > >> ;; ----------------------------- > >> > >> #lang racket > >> > >> (define nack #f) > >> > >> (sync (handle-evt > >> always-evt > >> (lambda (_) 'ALWAYS)) > >> (nack-guard-evt > >> (lambda (e) > >> (set! nack e) > >> never-evt))) > >> > >> nack > >> (printf "~a\n" (sync/timeout 0. nack)) > >> > >> > 'ALWAYS > >> #f > >> . . sync/timeout: contract violation > >> expected: evt? > >> given: #f > >> argument position: 2nd > >> other arguments...: > >> 0.0 > >> > >> OR > >> > >> > 'ALWAYS > >> #<evt> > >> #<void> > >> > >> > >> > >> -- > >> --------------------------------------------------------- > >> Tobias Hammer > >> DLR / Robotics and Mechatronics Center (RMC) > >> Muenchner Str. 20, D-82234 Wessling > >> Tel.: 08153/28-1487 > >> Mail: [email protected] > >> ____________________ > >> Racket Users list: > >> http://lists.racket-lang.org/users > > > -- > --------------------------------------------------------- > Tobias Hammer > DLR / Robotics and Mechatronics Center (RMC) > Muenchner Str. 20, D-82234 Wessling > Tel.: 08153/28-1487 > Mail: [email protected] ____________________ Racket Users list: http://lists.racket-lang.org/users

