The docs are clear about how macros execute before the enclosing code is run, but I’m still having trouble imagining where this is necessary, when we already have functions that return expressions.

It’s easy to come up with examples like `f_with_<>`

below a macro like `@m_xy`

does the same thing as a function like `f_xy`

. Are there some alternative examples where macros would be necessary or provide some performance benefit?

```
macro m_xy(op,x,y)
return Expr(:call,op,x,y)
end
function f_xy(op,x,y)
return Expr(:call,op,x,y)
end
function f_with_mac()
@m_xy(+,a*x,a*y)
end
function f_with_func()
eval(f_xy(+,a*x,a*y))
end
a = 2
x = 3
y = 4
@test f_with_mac() == eval(f_with_func())
```