short-circuiting of and/or
if-else will now propagate errors correctly
apply will expand macros once