我只是学习宏而且我对变量名以#开头的可能性感到困惑,但这正是宏似乎成功做到的事情.例如,如果我想将变量设置为等于4:
macro testMacro(sym)
esym = esc(sym)
quote
temp = 4
$esym = temp
return
end
end
Run Code Online (Sandbox Code Playgroud)
然后
julia> macroexpand(:(@testMacro ?))
quote # none, line 4:
#132#temp = 4 # line 5:
? = #132#temp # line 6:
return
end
julia> @testMacro ?
julia> ?
4
Run Code Online (Sandbox Code Playgroud)
请注意,temp变量名为#132#temp,我理解它将在REPL中进行评估.然而,这似乎是不可能的,因为整条生产线现在在技术上应该是一个评论.
如果我查看宏中的第一个表达式,我会得到一些我无法重现的东西.
julia> macroexpand(:(@testMacro ?)).args[2]
:(#132#temp = 4)
julia> ex = :(#132#temp = 4)
ERROR: syntax: incomplete: premature end of input
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?我想我从根本上有两个问题.1.)如果可能,我如何定义一个以#开头的变量(甚至在表达式中)?2.)假设存在这样一个变量,julia如何设法不将其视为评论?
Isa*_*ton 11
这里发生了什么?
这里的名称修改是为了保持宏观卫生,以便宏中定义的名称不会与环境中的其他名称冲突.(可以使用覆盖它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
Run Code Online (Sandbox Code Playgroud)
2.)假设存在这样一个变量,julia如何设法不将其视为评论?
注释将在解析器级别删除,因此系统的其余部分实际上从未实际看到它们.如上所示,可以从包含a的任意字符串创建Symbol #,这是宏代码在内部执行的操作.