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

Cho*_*ang 7 julia

我按照朱莉娅的文件:

julia> :(a in (1,2,3))
:($(Expr(:in, :a, :((1,2,3)))))
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*etz 9

原因:(a in (1,2,3))显示得很尴尬,:($(Expr(...)))因为showExpr类型对象(show_unquotedin show.jl)的函数不理解中in缀运算符和后备成通用打印格式.

本质上它是相同的,:(1 + 1)除了show_unquoted识别+为中缀运算符并很好地格式化它.

在任何情况下,:(...)并且$(...)在某种意义上是逆运算符,所以:($(..thing..))就像..thing..在这种情况下一样Expr(:in,:a,:((1,2,3))).

例如,人们可以看到这种古怪:(1+1).输出为Expr类型,如typeof(:(1+1))==Expr确认.实际上Expr(:+,1,1),但Expr(:+,1,1)在REPL上键入将显示:($(Expr(:+,1,1)))- Expr类型对象的通用格式样式.

修复show.jl处理in可能是一个很好的改变.但问题是无害的,并且关注显示格式.

  • 请注意,至少从julia`v"0.5.0-dev + 1020"`,`:( a in(1,2,3))`显示':( a in(1,2,3))`,正如@Chong Wang预料的那样.` (7认同)

Rez*_*lan 5

$ 是插值命令,Julia使用这种表示法来插入字符串以及表达式:

julia> a=1;
julia> "test $a" # => "test 1"
julia> :(b+$a) # => :(b + 1)
Run Code Online (Sandbox Code Playgroud)

当你在Julia REPL中输入一个命令时,它会尝试评估命令,如果代码最后没有;char,则打印结果,所以它与打印功能有关,在命令时会看到什么,当命令时执行.
所以如果你想看到一个变量的真实内容,一种可能就是使用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
Run Code Online (Sandbox Code Playgroud)

这是从上面的测试清楚,这两个表达式中使用的通用数据结构Exprhead,argstyp 没有任何$内部.
现在尝试评估并打印结果:

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

julia> :(a+b)
:(a + b)
Run Code Online (Sandbox Code Playgroud)

我们已经知道两个命令都创建了一个相同的结构,但是REPL不能显示:(a in b)更好Expr的结果,而另一个结果Expr就是$内部的原因.但在处理时:(a+b),REPL会更聪明地理解这一点:

Expr
  head: Symbol call
  args: Array(Any,(3,))
    1: Symbol +
    2: Symbol a
    3: Symbol b
  typ: Any
Run Code Online (Sandbox Code Playgroud)

等于:(a+b).