表达式
在 RustEdition 版本中, OpenEX 采用 pratt 表达式解析器(替换了原有的中转后缀表达式解析器), 并增加了编译期类型推断与校验功能.
注意
js
var a = 3.14 + null;
var b = true && 1 + 1;以上的组合都是非法的, 在编译期间可以被 OpenEX 检查出来
类型
虽然 OpenEX 本身是动态类型的, 在变量声明时也无需显示指定类型.
但是解释器内部对基元类型有明确的表示.
string字符串类型, 支持加法运算进行拼接number有符号整数类型, 相当于int64_ti64float双精浮点类型, 相当于doublef64null空类型bool布尔类型, 只有truefalse两种值unknown未知类型.
编译器无法明确推断出一个函数的返回值或变量的类型会采用
unknown类型进行标记.
此时, 编译器不再对unknown类型进行编译期类型检查
算术运算
在
number与float类型混合运算中, 最终的产生的计算结果类型为float
| 运算符 | 类型 | 运算类型 | 描述 |
|---|---|---|---|
+ | 双目运算符 | str number float | 加法运算 |
- | 双目运算符 | number float | 减法运算 |
* | 双目运算符 | number float | 乘法运算 |
/ | 双目运算符 | number float | 除法运算 |
% | 双目运算符 | number float | 取余运算 |
++ | 单目运算符 | number float | 自增运算 |
-- | 单目运算符 | number float | 自减运算 |
+ | 单目运算符 | number float | 无效果 |
- | 单目运算符 | number float | 取反运算符 |
逻辑运算
逻辑运算的表达式最终结果一定会被推断为
bool类型auto代表任何类型都可以
| 运算符 | 类型 | 运算类型 | 描述 |
|---|---|---|---|
== | 双目运算符 | auto | 比较运算 |
!= | 双目运算符 | auto | 不等于运算 |
> | 双目运算符 | number float | 大于比较 |
< | 双目运算符 | number float | 小于比较 |
>= | 双目运算符 | number float | 大于等于 |
<= | 双目运算符 | number float | 小于等于 |
! | 单目运算符 | bool | 逻辑取反 |
警告
RustEdition 新增加的编译期警告功能, 会对一些无作用的表达式发出警告信息.
js
1 + 1 == 2;
this.func_1() + 4;
true && false;以上都是无作用表达式, 编译器会对此类表达式发出警告.
可以通过
--allow=unused-expression命令行参数关闭该警告
优化
RustEdition 版本支持了更加强大的常量折叠优化, 会对常量表达式在编译期进行求值.
js
var a = 1 + 2 - 3 - 1;js
var a = -1;对于某些无法求值的表达式, 如类型未知, 值未知的表达式会递交给运行时计算.