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

物理d00d

我只是在学习宏,我对变量名以#开头的可能性感到困惑,但这正是宏似乎成功完成的事情。例如,如果我想将变量设置为等于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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在宏中使用保留名称(以_开头)?

除非传入变量名称,否则为什么不能访问在宏中声明的变量?

在R中,为什么变量名称以'。'开头 没有出现在我的环境中?

为什么在libc中可以滥用宏

为什么Julia中的字符串宏使用...?

在Julia中,为什么@printf是宏而不是函数?

在函数中已经存在的宏中声明具有相同名称的变量时,为什么没有收到警告?

DLL使用__stdcall而不进行名称修饰:为什么它甚至可以工作?

为什么在Kotlin中我以0开头的变量?

为什么在C中以$开头变量名?

为什么必须在符号名称中修饰返回类型中的decltype表达式?

为什么在Julia中使用宏?

Clojurescript宏和名称修饰

我可以从宏变量创建宏名称吗

在Clojure宏中评估修饰参数的惯用方式是什么?

变量可以修饰吗?

为什么我的宏变量无法解析?

展开变量名称中的宏值

为什么winform中的控件可以动态更改名称?

为什么可以在gradle任务的名称中忽略引号

为什么动态绑定可以覆盖C ++中隐藏的名称?

为什么要在C中定义具有相同名称和内容的宏?

为什么这个Julia宏_not_需要`esc`?

为什么将Erlang中的变量设计为以大写字母开头?

为什么变量应该在 C 中的新块的开头声明

在C#中,为什么在finally块的开头未明确分配变量?

为什么Rails中的局部变量以下划线开头?

当List <>在C#7.2中具有“ in”参数修饰符时,为什么仍可以修改它?

为什么Scala中的Final变量可以更改值