我按照朱莉娅的文件:
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))))),为什么朱莉娅以这种方式表达这个表达?究竟是$什么意思?在我看来,$只是评估全局范围中的下一个表达式.我发现文档对此不清楚.
原因:(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使用这种表示法来插入字符串以及表达式:
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)
这是从上面的测试清楚,这两个表达式中使用的通用数据结构Expr有head,args并typ 没有任何$内部.
现在尝试评估并打印结果:
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).
| 归档时间: |
|
| 查看次数: |
179 次 |
| 最近记录: |