dynamic_wind


dynamic_wind(in, body, out)
      

Return the result of evaluating body.

Dynamic_wind is useful for performing tasks that must be performed whenever control enters or leaves body, either normally or by continuation application.

The three arguments - in, body, and out - must be functions that accept zero arguments. Before applying body, and each time body is entered subsequently by the application of a continuation created within body, the in function is called. Upon normal exit from body and each time body is exited by the application of a continuation created outside body, the out function is applied. Thus, it is guaranteed that in is invoked at least once. In addition, if body ever returns, out is invoked at least once.

Examples:


dynamic_wind(^() showln("hello!"),
             ^() showln("doing some work..."),
             ^() showln("goodbye!"))
//> hello!
    doing some work...
    goodbye!

let kk = false  
dynamic_wind(^() showln("hello!"),
             ^() { callcc(^(k) kk = k)
                   showln("doing some work...") },
             ^() showln("goodbye!"))
//> hello!
    doing some work...
    goodbye!

kk()
//> hello!
    doing some work...
    goodbye!

dynamic_wind(^() showln("hello!"),
             ^() { raise('blah)
                   showln("doing some work...") },
             ^() showln("goodbye!"))
//> hello!
    goodbye!
//> error: This object was raised: blah
      

Also see:

callcc


Core Module Index | Contents