2015-04-05 44 views
4

我只是在学习宏,我对变量名以#开头的可能性感到困惑,但这正是宏成功做到的。例如,如果我想设置一个变量等于4:为什么变量可以从Julia宏命名中开始#

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 

通知临时变量名为#132#温度,这是我的理解是,它会在被评估REPL就是这样。然而,这似乎是不可能的,因为整条线现在在技术上应该是一个评论。

如果我看一下宏中的第一个表达式,我会得到一些我无法重现的东西。

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

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


ERROR: syntax: incomplete: premature end of input 

这是怎么回事?我想我基本上有两个问题。 1.)如果可能,我怎样才能定义一个以#开头的变量(甚至在表达式中)? 2.)假设存在这样一个变量,朱莉娅如何设法不把它当作评论呢?

回答

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)假设这样一个变量的存在,如何管理朱莉娅不把它作为一个评论?

评论在解析器级别被丢弃,所以系统的其余部分从未真正看到它们。如上所示,可以从包含#的任意字符串创建符号,这是宏代码在内部执行的操作。

相关问题