不是合法标识符的符号

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