macro_rules! defer {
    ($func:block) => { ... };
    ($func:expr) => { ... };
    { $($func:expr;)+ } => { ... };
}
Expand description

Defers evaluation of a block of code until the end of the scope. Sort of LIFO(last-in, first-out queue) If you encounter references to resources that cannot mut more than 2 times, try nesting RefCell and then use.borrow() and.borrow_mut().

for example:

 use cogo::defer;
 //LIFO, so it will print: guard: 3  guard: 2   guard: 1
 fn main(){
    defer!({
       println!("guard: 1");
       });
    defer!(||{
       println!("guard: 2");
       });
    defer!{
       println!("guard: 3");
    }
}