为什么变量可以从#Julia Macro Name Mangling开始?

时间:2015-04-05 17:43:01

标签: julia

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

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

然后

julia> macroexpand(:(@testMacro α))
quote  # none, line 4:
    #132#temp = 4 # line 5:
    α = #132#temp # line 6:
    return
end

julia> @testMacro α

julia> α
4

注意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如何设法不将其视为评论?

1 个答案:

答案 0 :(得分:11)

  

这里发生了什么?

此处的名称修改是为了保留macro hygiene,以便宏中定义的名称不会与环境中的其他名称冲突。 (可以使用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如何设法不将其视为评论?

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