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.