I know Julia is not at that stage anymore, but i’m curious to know. And just to clarify the macrocall @foo .x, expression, i mean:
Expr
head: Symbol macrocall
args: Array{Any}((2,))
1: Symbol @foo
2: Expr
head: Symbol .
args: Array{Any}((1,))
Symbol x
Edit: fixed expression mistake
Because whitespace is important in Julia. @foo.x and foo.@x are the same thing (a macro call with 0 arguments) whereas @foo .x is a macro call with 1 argument, the same as @foo(.x).
.x is a valid expression to the parser, it is used for relative imports like using .Foo.
3 Likes
To expand upon what @cjdoris said:
The syntaxes Base.@kwdef and @Base.kwdef are equivalent. They both refer to the macro @kwdef, which is defined in the Base module.
julia> :(Base.@kwdef) == :(@Base.kwdef)
true
julia> dump(:(Base.@kwdef))
Expr
head: Symbol macrocall
args: Array{Any}((2,))
1: Expr
head: Symbol .
args: Array{Any}((2,))
1: Symbol Base
2: QuoteNode
value: Symbol @kwdef
2: LineNumberNode
line: Int64 1
file: Symbol REPL[2]
julia> dump(:(@Base.kwdef))
Expr
head: Symbol macrocall
args: Array{Any}((2,))
1: Expr
head: Symbol .
args: Array{Any}((2,))
1: Symbol Base
2: QuoteNode
value: Symbol @kwdef
2: LineNumberNode
line: Int64 1
file: Symbol REPL[3]
However, I think it makes more sense to use the Base.@kwdef syntax.
1 Like
Using @Module.macro instead of Module.@macro strikes me as a bit of a legacy syntax and it’s kind of too bad we kept it for Julia 1.0, but yes, they mean the same thing and parse the same.
3 Likes
This is surprising, I have never considered Mod.@macro to be valid before.