Julia 为什么朱莉娅用如此复杂的方式表达这个表达?
我遵循julia的文档:Julia 为什么朱莉娅用如此复杂的方式表达这个表达?,julia,Julia,我遵循julia的文档: julia> :(a in (1,2,3)) :($(Expr(:in, :a, :((1,2,3))))) 既然:(a in(1,2,3))==:($(Expr(:in,:a,:((1,2,3))),为什么朱莉娅要用这种方式表达这个表达式呢?$到底是什么意思?在我看来,$只是计算全局范围内的下一个表达式。我发现文档对此不清楚。$是插值命令,Julia使用此符号来插值字符串和表达式: julia> a=1; julia> "test $a" # =&
julia> :(a in (1,2,3))
:($(Expr(:in, :a, :((1,2,3)))))
既然
:(a in(1,2,3))==:($(Expr(:in,:a,:((1,2,3)))
,为什么朱莉娅要用这种方式表达这个表达式呢?$
到底是什么意思?在我看来,$
只是计算全局范围内的下一个表达式。我发现文档对此不清楚。$
是插值命令,Julia使用此符号来插值字符串和表达式:
julia> a=1;
julia> "test $a" # => "test 1"
julia> :(b+$a) # => :(b + 1)
在Julia REPL中键入命令时,它会尝试计算该命令,如果代码没有代码>字符在最后它打印结果,因此它与打印功能更相关,即当命令执行时,REPL上会看到的内容。
因此,如果您想查看变量的真实内容,一种可能是使用dump
函数:
julia> dump(:(a+b))
Expr
head: Symbol call
args: Array(Any,(3,))
1: Symbol +
2: Symbol a
3: Symbol b
typ: Any
julia> dump(:(a in b))
Expr
head: Symbol in
args: Array(Any,(2,))
1: Symbol a
2: Symbol b
typ: Any
从上面的测试中可以清楚地看出,这两个表达式都使用一个公共数据结构,即Expr
,带有head
、args
和typ
,内部没有任何$
现在尝试评估并打印结果:
julia> :(a in b)
:($(Expr(:in, :a, :b)))
julia> :(a+b)
:(a + b)
我们已经知道,这两个命令创建了一个相同的结构,但是REPL不能显示的结果:(b中的a)
比另一个Expr
的结果的Expr
更好,这就是为什么$
内部有一个。但在处理:(a+b)
时,REPL会更聪明地处理,并理解这一点:
Expr
head: Symbol call
args: Array(Any,(3,))
1: Symbol +
2: Symbol a
3: Symbol b
typ: Any
等于:(a+b)
之所以:(1,2,3)中的a)
笨拙地显示为:($(Expr(…))
是因为显示Expr类型对象的函数(显示.jl
中的)不理解中缀操作符中的,并退回到通用打印格式
本质上它与:(1+1)
相同,只是show\u unquoted
将+
识别为中缀运算符,并将其格式设置得很好
在任何情况下,:(…)
和$(…)
在某种意义上都是逆运算符,因此:($($(..)thing..)
与.thing..
完全相同,在这种情况下是Expr(:In,:a,:((1,2,3))
例如,你可以在:(1+1)
中看到这种奇怪。输出为Expr类型,因为typeof(:(1+1))==Expr
确认。它实际上是Expr(:+,1,1)
,但在REPL上键入Expr(:+,1,1)
将显示:($(Expr(:+,1,1)))
——Expr类型对象的通用格式样式
将show.jl
修复为在中处理,可能是一个不错的改变。但是这个问题是无害的,涉及到显示格式。请注意,至少自从juliav“0.5.0-dev+1020”
,:(1,2,3中的a))
准确地显示了:(1,2,3中的a))
,正如@Chong Wang所期望的那样`请参阅Julia语言元编程文档: