结合律

第一个字符是 ^ 的二元运算符是右结合,所有其他二元运算符都是左结合。

  1. proc `^/`(x, y: float): float =
  2. # 右关联除法运算符
  3. result = x / y
  4. echo 12 ^/ 4 ^/ 8 # 24.0 (4 / 8 = 0.5, then 12 / 0.5 = 24.0)
  5. echo 12 / 4 / 8 # 0.375 (12 / 4 = 3.0, then 3 / 8 = 0.375)

一元运算符总是比任何二元运算符优先: $a + b is ($a) + b 而不是 $(a + b)

如果一元运算符的第一个字符是 @ 它是 符印样 运算符,比 主后缀 优先: @x.abc 解析成 (@x).abc$x.abc 解析成 $(x.abc)

对于非关键字的二元运算符,优先级由以下规则确定:

->, ~> or => 结尾的运算符称为 箭头形, 优先级最低。

如果操作符以 = 结尾,并且它的第一个字符不是 <, >, !, =, ~, ?, 它是一个 赋值运算符 具有第二低的优先级。

否则优先级由第一个字符决定。

优先级运算符首字符终端符号
10 (highest)$ ^OP10
9 / div mod shl shr % % \ /OP9
8+ -+ - ~ |OP8
7&&OP7
6...OP6
5== <= < >= > != in notin is isnot not of= < > !OP5
4andOP4
3or xorOP3
2@ : ?OP2
1赋值运算符 (like +=, *=)OP1
0 (lowest)箭头形操作符 (like ->, =>)OP0

运算符是否使用前缀运算符也受前面的空格影响(此版本的修改随版本0.13.0引入):

  1. echo $foo
  2. # 解析成
  3. echo($foo)

间距还决定了 (a, b) 是否被解析为调用的参数列表,或者它是否被解析为元组构造函数:

  1. echo(1, 2) # 传1和2给echo
  1. echo (1, 2) # 传元组(1, 2)给echo