Main entrypoint take 3 - revenge of the macro (#51435)
As they say, if at first you don't succeed, try again, then try again,
add an extra layer of indirection and take a little bit of spice from
every other idea and you've got yourself a wedding cake. Or something
like that, I don't know - at times it felt like this cake was getting a
bit burnt.
Where was I?
Ah yes.
This is the third edition of the main saga (#50974, #51417). In this
version, the spelling that we'd expect for the main use case is:
```
function (@main)(ARGS)
println("Hello World")
end
```
This syntax was originally proposed by `@vtjnash`. However, the
semantics here are slightly different. `@main` simply expands to `main`,
so the above is equivalent to:
```
function main(ARGS)
println("Hello World")
end
@main
```
So `@main` is simply a marker that the `main` binding has special
behavior. This way, all the niceceties of import/export, etc. can still
be used as in the original `Main.main` proposal, but there is an
explicit opt-in and feature detect macro to avoid executing this when
people do not expect.
Additionally, there is a smooth upgrade path if we decide to
automatically enable `Main.main` in Julia 2.0.