I expected that the two forms would yield identical results. But to my surprise:
julia> @eval :x
ERROR: UndefVarError: x not defined
 top-level scope
 eval at ./boot.jl:319 [inlined]
 eval(::Symbol) at ./client.jl:389
 top-level scope at none:0
Yes. The input to macros is always converted to an expression, the output is getting evaluated. So, when you do @eval :x, inside the macro the argument is :(:x). When that gets returned, it is evaluated, giving the symbol :x.
By contrast, eval takes as an argument an Expr or Symbol object. So, when it runs, it’s running the code contained in that Expr (or Symbol) which is in this case just x.