我只是在学习宏,我对变量名以#开头的可能性感到困惑,但这正是宏似乎成功完成的事情。例如,如果我想将变量设置为等于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
注意,临时变量名为#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.)假设存在这样的变量,朱莉娅如何设法不将其视为注释?
这里发生了什么?
此处的名称更改是为了保留宏的卫生习惯,以便在宏中定义的名称不会与环境中的其他名称冲突。(可以使用来覆盖它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.)假设存在这样的变量,朱莉娅如何设法不将其视为注释?
注释在解析器级别被删除,因此系统的其余部分实际上从未看到它们。如上所示,可以从包含a的任意字符串创建符号#
,这是宏代码在内部执行的操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句