Skip to content

表达式

RustEdition 版本中, OpenEX 采用 pratt 表达式解析器(替换了原有的中转后缀表达式解析器), 并增加了编译期类型推断与校验功能.

注意

js
var a = 3.14 + null;
var b = true && 1 + 1;

以上的组合都是非法的, 在编译期间可以被 OpenEX 检查出来

类型

虽然 OpenEX 本身是动态类型的, 在变量声明时也无需显示指定类型.
但是解释器内部对基元类型有明确的表示.

  • string 字符串类型, 支持加法运算进行拼接
  • number 有符号整数类型, 相当于 int64_t i64
  • float 双精浮点类型, 相当于 double f64
  • null 空类型
  • bool 布尔类型, 只有 true false 两种值
  • unknown 未知类型.

编译器无法明确推断出一个函数的返回值或变量的类型会采用 unknown 类型进行标记.
此时, 编译器不再对 unknown 类型进行编译期类型检查

算术运算

numberfloat 类型混合运算中, 最终的产生的计算结果类型为 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;

对于某些无法求值的表达式, 如类型未知, 值未知的表达式会递交给运行时计算.

本文档采用 知识共享 署名-相同方式共享 4.0 协议 进行许可。