为什么朱莉娅以这种复杂的方式表达这种表达?

时间:2015-11-03 07:58:53

标签: julia

我遵循了朱莉娅的文件:

julia> :(a in (1,2,3))
:($(Expr(:in, :a, :((1,2,3)))))

现在:(a in (1,2,3))==:($(Expr(:in, :a, :((1,2,3))))),为什么朱莉娅以这种方式表达这个表达?$究竟意味着什么?在我看来,$只是评估全局范围中的下一个表达式。我发现文档对此不清楚。

2 个答案:

答案 0 :(得分:9)

:(a in (1,2,3))显示为:($(Expr(...)))的原因与show一样尴尬是因为Expr类型对象的show_unquoted函数(show.jl中的in)不理解{ {1}}将运算符和后备中缀为通用打印格式。

基本上它与:(1 + 1)相同,只是show_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来处理in可能是一个很好的改变。但问题是无害的,并且关注显示格式化。

答案 1 :(得分:5)

$是插值命令,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的公共数据结构,headargstyp 内部$ 现在尝试评估和打印结果:

julia> :(a in b)
:($(Expr(:in, :a, :b)))

julia> :(a+b)
:(a + b)

我们已经知道两个命令都创建了相同的结构,但REPL不能更好地显示另一个:(a in b)的{​​{1}}结果的Expr及其结果#39} ;为什么在Expr里面。但是在处理$时,REPL会更聪明地理解这一点:

:(a+b)

等于Expr head: Symbol call args: Array(Any,(3,)) 1: Symbol + 2: Symbol a 3: Symbol b typ: Any