hi there,<br><br>I have a little helper function that does something like this:<br><br>(define (helper thunk)<br>&nbsp; (setup)<br>&nbsp; (let ((result (thunk))<br>&nbsp;&nbsp;&nbsp;&nbsp; (teardown)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result))<br><br>Meaning my helper wraps a call to a thunk with some setup/teardown actions and returns whatever thunk returned. If thunk raises an error however, I do not want for teardown to be called. 
<br><br>Assuming I have no control over thunk, how do I make the helper cope with possible multiple return values from thunk?<br><br>Here is my attempt:<br><br>(define (helper thunk)<br>&nbsp; (let ((success #t))<br>&nbsp;&nbsp;&nbsp; (dynamic-wind
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lambda () (printf &quot;Setup~n&quot;))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lambda ()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (with-handlers (((lambda ex #t)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lambda (exn)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (set! success #f)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (raise exn))))
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (thunk)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (lambda()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if success<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (printf &quot;Teardown~n&quot;))))))<br><br>&gt; (helper (lambda () (values 1 2 3)))<br>Setup<br>Teardown<br>1<br>2<br>3<br><br>&gt; (helper (lambda () 1))a
<br>Setup<br>Teardown<br>1<br><br>&gt; (helper (lambda () (error &quot;Abort&quot;) (values 1 2 3)))<br>Setup<br>&gt; Abort<br><br>This seems to work, but its ugly. Is there a nicer solution?<br><br>-pp<br><br><br><br><br>
-pp<br><br>