为什么在朱莉娅重新定义后,符号操作的顺序仍然存在?

时间:2017-03-20 17:06:12

标签: julia

在朱莉娅,我们可以重新定义运算符,如+,×,sin,cos等。但有一件有趣的事情是,在重新定义之后,所有修改过的运算符之间的顺序仍然存在,比如乘法仍然在求和之前,无论你如何重新定义自己的函数,为什么?

1 个答案:

答案 0 :(得分:7)

这只是为中缀运算符定义operator precedence的函数。您可以在手册中找到precedence table。优先级定义了如何将Julia代码解析为嵌套函数调用序列。您可以使用括号或传统函数调用语法手动指定优先级。

你可以通过让Julia解析(但不执行)代码来看到这种情况。它返回一个带引号的表达式,该表达式以模仿Julia中编写该代码的标准方式的方式打印。有许多工具可以让你检查这个引用的表达式;一个有助于显示呼叫嵌套的是Meta.show_sexpr

julia> ex = parse("1 + 2 * 3")
:(1 + 2 * 3)

julia> Meta.show_sexpr(ex)
(:call, :+, 1, (:call, :*, 2, 3))

这只是声明它会在向它添加1之前乘以2 * 3。这完全基于括号的嵌套结构。无论定义什么函数绑定到*,都将首先执行。现在将上面的结果与以下内容进行比较:

parse("(1 + 2) * 3")
parse("+(1, *(2, 3))")
parse("*(1, +(2, 3))")