不是合法識別符號的符號

Julia Symbol 文字必須是合法識別符號。這有效:

julia> :cat
:cat

但這不是:

julia> :2cat
ERROR: MethodError: no method matching *(::Int64, ::Base.#cat)
Closest candidates are:
  *(::Any, ::Any, ::Any, ::Any...) at operators.jl:288
  *{T<:Union{Int128,Int16,Int32,Int64,Int8,UInt128,UInt16,UInt32,UInt64,UInt8}}(::T<:Union{Int128,Int16,Int32,Int64,Int8,UInt128,UInt16,UInt32,UInt64,UInt8}, ::T<:Union{Int128,Int16,Int32,Int64,Int8,UInt128,UInt16,UInt32,UInt64,UInt8}) at int.jl:33
  *(::Real, ::Complex{Bool}) at complex.jl:180
  ...

看起來像這裡的符號文字實際上被解析為:2(這只是 2)和函式 cat 的隱式乘法,這顯然不起作用。

我們可以用

julia> Symbol("2cat")
Symbol("2cat")

解決這個問題。

字串巨集可以幫助使這更簡潔。如果我們定義 @sym_str 巨集:

macro sym_str(str)
    Meta.quot(Symbol(str))
end

那我們就可以做到

julia> sym"2cat"
Symbol("2cat")

建立無效 Julia 識別符號的符號。

當然,這些技術還可以建立符號有效的朱莉婭識別符號。例如,

julia> sym"test"
:test