[racket] again: timeouts and exceptions

From: Rüdiger Asche (rac at ruediger-asche.de)
Date: Fri Jul 6 03:15:43 EDT 2012

by the way, you were absolutely right, of course. I must have been  
blind on both ears and deaf on both eyes not to think about CPS in  
this case. It works like a charm now!

Thanks again!

>
> ----- Original Message ----- From: "Matthias Felleisen"   
> <matthias at ccs.neu.edu>
> To: "Rüdiger Asche" <rac at ruediger-asche.de>
> Cc: "users" <users at racket-lang.org>
> Sent: Thursday, July 05, 2012 8:06 PM
> Subject: Re: [racket] again: timeouts and exceptions
>
>
>
> 1. I don't know where this prose is but it reads rather confusing.
>
> 2. If I were you, I'd use an escape continuation rather than an
> exception handler here. What you seem to want is flow of control, and
> let/ec is the right tool then.
>
>
>
>
>
> On Jul 5, 2012, at 9:42 AM, Rüdiger Asche wrote:
>
>> Hi there,
>>
>> a few of you recommended to implement timeouting reads via   
>> sync/timeout. That works neat, but it would be even nicer to   
>> combine this w/ exception handling, like so:
>>
>>
>> ...
>> ((readbytetimeout)
>>   (lambda (port)
>>           (if (sync/timeout READTIMEOUT inport)
>>       (read-byte inport)
>>       (raise "read-byte" #t))))
>> ...
>> ((readsomething) ..... (readbytetimeout) ......
>>
>>
>> (letrec ((repl (lambda ()
>>       (dosomethingthatmustexecuteperiodically)
>>               (let ((readresult
>>      (call-with-exception-handler HandlerFn
>> (readsomething))))
>> (repl)))))
>> (repl))
>>
>> Iow, I want the REPL to always be operational but restart from the   
>> beginning when the innermost read timeouts so that the periodic   
>> computations get their turn.
>>
>> I didn't get this to work though because according to the docs, "If the
>> exception handler returns a value when invoked by raise, then raise
>> propagates the value to the «previous» exception handler (still in the
>> dynamic extent of the call to raise, and under the same barrier, if any)."
>>
>> That is true; I get thrown back out of the entire thing because the  
>>  default uncaught exception handler is called. What ectually does  
>> it  mean "IF the
>> exception handler..." How is it possible for a function NOT to   
>> return a value?
>> Any return value including #f and () will propagate the exception to the
>> default handler; I simply want to stop it where it is.
>>
>> What do I need to do (or paraphrased: What is the necessary   
>> implementation of HandlerFn) in order to get this to work? Or do I   
>> need yet another control flow or handling mechanism?
>>
>> Thanks!
>>
>>
>>
>> ____________________
>> Racket Users list:
>> http://lists.racket-lang.org/users
>
> ____________________
>  Racket Users list:
>  http://lists.racket-lang.org/users





Posted on the users mailing list.