Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Julia 为什么朱莉娅用如此复杂的方式表达这个表达?_Julia - Fatal编程技术网

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的文档:

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
修复为在
中处理
,可能是一个不错的改变。但是这个问题是无害的,涉及到显示格式。

请注意,至少自从julia
v“0.5.0-dev+1020”
:(1,2,3中的a))
准确地显示了
:(1,2,3中的a))
,正如@Chong Wang所期望的那样`请参阅Julia语言元编程文档: