我遵循了朱莉娅的文件:
julia> :(a in (1,2,3))
:($(Expr(:in, :a, :((1,2,3)))))
现在:(a in (1,2,3))==:($(Expr(:in, :a, :((1,2,3)))))
,为什么朱莉娅以这种方式表达这个表达?$
究竟意味着什么?在我看来,$
只是评估全局范围中的下一个表达式。我发现文档对此不清楚。
答案 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
的公共数据结构,head
,args
和typ
内部$
现在尝试评估和打印结果:
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
。