结合律
第一个字符是 ^ 的二元运算符是右结合,所有其他二元运算符都是左结合。
- proc `^/`(x, y: float): float =
- # 右关联除法运算符
- result = x / y
- echo 12 ^/ 4 ^/ 8 # 24.0 (4 / 8 = 0.5, then 12 / 0.5 = 24.0)
- 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 |
4 | and | OP4 | |
3 | or xor | OP3 | |
2 | @ : ? | OP2 | |
1 | 赋值运算符 (like +=, *=) | OP1 | |
0 (lowest) | 箭头形操作符 (like ->, =>) | OP0 |
运算符是否使用前缀运算符也受前面的空格影响(此版本的修改随版本0.13.0引入):
- echo $foo
- # 解析成
- echo($foo)
间距还决定了 (a, b) 是否被解析为调用的参数列表,或者它是否被解析为元组构造函数:
- echo(1, 2) # 传1和2给echo
- echo (1, 2) # 传元组(1, 2)给echo