为什么变量可以在Julia宏名称Mangling中以#开头?

为什么变量可以在Julia宏名称Mangling中以#开头?,julia,Julia,我只是在学习宏,我对变量名如何可能以#开头感到困惑,但这正是宏似乎成功做到的。例如,如果要将变量设置为等于4: macro testMacro(sym) esym = esc(sym) quote temp = 4 $esym = temp return end end 然后 注意,temp变量名为#132#temp,据我所知,它将在REPL中像那样进行计算。然而,这似乎是不可能的,因为从技术上讲,这整句话现在应该是一个评论 如果我查看宏中的第一个表达式,就

我只是在学习宏,我对变量名如何可能以#开头感到困惑,但这正是宏似乎成功做到的。例如,如果要将变量设置为等于4:

macro testMacro(sym)
  esym = esc(sym)
  quote
    temp = 4
    $esym = temp
    return
  end
end
然后

注意,temp变量名为#132#temp,据我所知,它将在REPL中像那样进行计算。然而,这似乎是不可能的,因为从技术上讲,这整句话现在应该是一个评论

如果我查看宏中的第一个表达式,就会得到一些无法复制的结果

julia> macroexpand(:(@testMacro α)).args[2]
:(#132#temp = 4)

julia> ex = :(#132#temp = 4)


ERROR: syntax: incomplete: premature end of input
这是怎么回事?我想我基本上有两个问题。1.)如果可能,如何定义以#开头的变量(即使在表达式中也是如此)?2.)假设存在这样一个变量,julia如何不将其视为注释

这是怎么回事

此处的名称损坏是为了保留,以便宏中定义的名称不会与环境中的其他名称冲突。(可以使用
esc
)覆盖此选项)

1.)如果可能,如何定义以#开头的变量(即使在表达式中也是如此)

我不知道为什么要这样做,因为访问变量会很麻烦。但有可能:

julia> eval(Expr(:(=), symbol("#s"), 1))
1

julia> whos()
#s                            Int64
Base                          Module
Core                          Module
LastMain                      Module
Main                          Module
ans                           Int64

julia> eval(symbol("#s"))
1
2.)假设存在这样一个变量,julia如何不将其视为注释

注释是在解析器级别删除的,因此系统的其他部分实际上从未看到它们。如上所示,可以从包含
#
的任意字符串创建符号,这是宏代码在内部执行的操作

julia> eval(Expr(:(=), symbol("#s"), 1))
1

julia> whos()
#s                            Int64
Base                          Module
Core                          Module
LastMain                      Module
Main                          Module
ans                           Int64

julia> eval(symbol("#s"))
1