Skip to content

表达式(Expression)

一套可能包含许多数学运算符、变量/常量、函数,计算后返回浮点数的数学表达式。

表达式以字符串形式存在,由 Paralithic 进行解析与计算。

表达式以简单数学格式写就,例如,3 + 2 / 8 即表示 (3+2)8

数字格式

在表达式中,所有数字均视为浮点数

一个数字本身即为一条有效的表达式。

  • 数字可以像 5832 这样直接定义。
  • 小数可以像 64.34 这样定义。
  • 小数后多余的零同样有效,例如 64.00
  • 下划线 _ 可以用作虚拟分隔符(实际运算中会被忽略),如 1_000_000
  • 可以在数字末尾加上国际单位制词头,例如 2m 算作 2 * 1000,即 2000,此处 m 指 mega。
量词对应值全名
n0.000000001(1×109
u0.000001(1×106
m0.001(1×103
K1_000(1×103
M1_000_000(1×106
G1_000_000_000(1×109吉咖
  • 数字可以以正号 + 或负号 - 表示其正负。如 -1337+1337
  • 数字可以使用科学计数法表示,字符 e(或 E)为幂与小数部分的分隔符。例如,6.72e9 等价于 6.72×109,或 6_720_000_000。

变量

命名常量/变量是带有名称的值。在表达式中填写它们的变量名称即可引用,例如,在表达式中引用变量 myVariablemyVariable * 20

无法在表达式中定义新变量。变量是在表达式之外定义的。可以使用的变量取决于表达式的情景,部分配置对象有特定的变量,如 xy,会随世界位置改变,部分配置还允许你自定义用于表达式的常量。

内建常量

如下常量可以在任何表达式中使用:

运算

布尔值表示

表达式能处理浮点数,但它们还支持布尔值参与的逻辑运算。为了支持这样的运算,false 视作 0true 可以表示为任意非零值。如果运算返回 true,这表示它们返回的值是 1

信息

布尔值通常与 if 内置函数搭配使用,因此大部分情况下数字的布尔值表示是不可见的。例如,表达式 if(1 > 2, 5, 8) 没有直接引用 10(即 true 和 false)。

可用运算符

如下为表达式内可用的运算符,按优先级从高到低排列,计算时按优先级从高到低解析。保留词 exprleftright 用于引入新表达式(数字、变量或其他运算符等):

运算符格式描述
1(表达式)表达式组,允许调整优先级
1|表达式|取表达式的绝对值
-
2-表达式表达式取反
-
3左 ^ 右幂运算,相当于 次方
-
4左 * 右左右相乘
4左 / 右左除以右
4左 % 右左除以右,取余
-
5左 + 右左右相加
5左 - 右左减去右
-
6左 < 右若右大于左则返回 true,反之返回 false
6左 <= 右若右大于等于左则返回 true,反之返回 false
6左 > 右若左大于右则返回 true,反之返回 false
6左 >= 右若左大于等于右则返回 true,反之返回 false
6左 = 右若左右相等则返回 true,否则返回 false
6左 != 右若左右不等则返回 true,否则返回 false
-
7左 && 右若左右均为 true 则返回 true,否则返回 false
7左 || 右若左或右为 true 则返回 true,否则返回 false

结合性

二元运算(只有两个数参与的运算)为左结合性,即优先级相同的情况下从左至右运算,如 3 - 2 + 1 + 3 则为 (((3 - 2) + 1) + 3)

函数

函数以名称加括号的形式在表达式中调用。参数填入括号内,多个参数使用英文逗号 , 分隔。

  • 无参数:exampleFunction()
  • 单参数:exampleFunction(3)
  • 多参数:exampleFunction(3, 2)

传入函数的参数也可以是表达式,如下所示:

  • exampleFunction(3 + 2 / exampleFunction(9 * 5))

内置函数

如下为内置的函数列表,可在所有表达式中使用:

函数名称参数数量函数描述
floor1为传入的浮点数向下取整
ceil1为传入的浮点数向上取整
round1为传入的浮点数四舍五入取整
pow2幂运算,第一个参数为底数,第二个参数为指数
min2返回二者中较小的值
max2返回二者中较大的值
sqrt1取传入数的平方根
sin1取传入数的正弦值
cos1取传入数的余弦值
tan1取传入数的正切值
sinh1取传入数的双曲正弦值
cosh1取传入数的双曲余弦值
tanh1取传入数的双曲正切值
asin1取传入数的反正弦值
acos1取传入数的反余弦值
atan2取传入数的反正切值
atan22维基百科
rad1将传入数转为弧度
deg1将传入数转为角度
abs1取传入数的绝对值
log1返回以 10 为底数,传入参数的对数值
ln1返回以自然常数 e 为底数,传入参数的对数值
exp1返回 e 的传入参数次幂
sign1传入参数 < 0.0,返回 -1.0,若 传入参数 = 0.0,则返回 0.0,如果 传入参数 > 0.0,则返回 1.0
sigmoid2S 型函数运算。等价于 1exp(1×a×b)
if3三元表达式 - 如果首个参数为 true(释义见此),则返回第二个参数,否则返回第三个参数。

留白

空字符(空格、换行、TAB 制表符等)可以出现在表达式中。空字符可以用于分隔表达式,例如将其分为多行,在运算符之间插入空格便于阅读。任何带空格的语句与无空格的形式等同。

例如,将如下函数的参数分为多行:

text
atan2(
  1 + 45,
  4 / 8
)

信息

在 YAML 中定义多行表达式时,建议使用 | 表示的多行格式,例如:

YAML
expression: |
  atan2(
    1 + 45,
    4 / 8
  )

注释

任何双斜杠 // 之后的文本都会视作注释。它们不会被解析。

例如:4 * 2 // 此为注释

插件同样支持多行注释,/**/ 之间的文本视作多行注释,不会被解析。

例如:

text
atan2(
  1 + 45,
  4 / 8
  /* 这里是一条多行注释
     在这里的文本不会参与表达式计算 */
)

用途

有 3 个参数用到:

  • NoiseSampler 中的 EXPRESSION:
expression 表达式
  • MathFunction 中的 map:
expression 表达式
  • NoiseSampler 中的 EXPRESSION_NORMALIZER:
expression 表达式 - 使用 ininput 的缩写)参数的表达式。

贡献者

页面历史