#[macro_export] macro_rules! defer { ($body:block) => { struct _Defer_ { closure: F, } impl Drop for _Defer_ { fn drop(&mut self) { (self.closure)(); } } let _defer_ = _Defer_ { closure: || $body, }; }; ($body:expr) => { $crate::defer! {{ $body }} }; } #[macro_export] macro_rules! scope_restore { ($val:ident, $ours:expr) => { let theirs = $crate::utils::exchange($val, $ours); $crate::defer! {{ *$val = theirs; }}; }; }