Macros are collection of events. Event use the engine task queue system, that’s how we can get things like delay nodes and/or latent async actions.
A function however is a straight block of code. 1, 2 ,3 etc on the cpu. Guaranteed to run. This allows us to declare temp variables on the stack the get released once the function is complete.