pub struct Defer(pub Option); impl Drop for Defer { fn drop(&mut self) { if let Some(f) = self.0.take() { f(); } } } #[macro_export] macro_rules! defer { ($($x:tt)*) => { let _defer = crate::defer::Defer(Some(move || {$($x)*})); }; }