LSR 014 - 运算符规范¶
基本信息¶
LSR 编号 014
标题 运算符规范
作者 Ziyang-Bai
状态 草案
类型 标准规范
创建日期 08-11-2026
归属项目 编译器、标准库、CAS
摘要¶
定义 Lamina 中数学表达式和普通表达式可使用的运算符、分隔符、关键字型运算符、优先级和结合性。Lamina 源码和标准文档示例都必须使用本规范列出的 token。
技术规范¶
1. 范围¶
本规范定义 Lamina 源码层运算符集合、调用实参和切片分隔符。数学值的基本静态类型为 num,值约束与支持域由核心规范定义 [1];运算符不决定整数、有理数或符号树的内部表示。
源码运算符统一使用下表 token,接收表达式文本的库接口遵循同一集合。
2. 源码 token¶
源码中的运算符、分隔符和关键字型运算符由下列 token 组成。保留但未定义语义的 token 在第 8 节单独列出。
类别 |
token |
用途 |
|---|---|---|
算术 |
|
加、减、乘、除、整除、取余、幂 |
广播算术 |
|
向量、矩阵或同形状容器的元素级运算 |
矩阵除法 |
|
矩阵左除 |
比较 |
|
数学关系、三态等价查询、显式引用对象同一性 |
广播比较 |
|
向量、矩阵或同形状容器的元素级比较 |
逻辑 |
|
逻辑与、逻辑或、逻辑非 |
集合 |
|
从属、子集、并集、交集、对称差 |
显式转换 |
|
类型或单位转换 |
调用与访问 |
|
调用、分组、元组、数组、索引、成员访问、参数分隔和矩阵行分隔 |
线性代数 |
|
共轭转置、非共轭转置 |
集合字面量 |
|
集合和集合推导式 |
切片 |
|
下标中的含端点索引范围、整轴选择 |
可空标注 |
|
类型标注中的可空值 |
CAS 替换规则 |
|
表达式中构造专用 |
流程与函数 |
|
函数箭头、管道 |
绑定 |
|
绑定、赋值或调用中的具名实参,由各自语法位置决定 |
以下示例使用合法 token。
sym x, y
let item = 1
let values = {1, 2, 3}
let a = x^2 + 1
let b = x <= y and y != 0
let c = item in values
<=是合法源码运算符!=是合法源码运算符and、or、not是逻辑运算关键字&&、||不属于 Lamina 核心逻辑运算符乘法必须显式写作
*
3. 运算符表¶
类别 |
运算符 |
结合性 |
说明 |
|---|---|---|---|
后缀 |
|
左结合 |
调用、成员访问、索引、转置 |
幂 |
|
右结合 |
|
一元 |
|
右结合 |
正号、负号、逻辑非 |
乘法 |
|
左结合 |
乘、除、整除、取余、矩阵左除 |
广播乘法 |
|
左结合 |
元素级乘、除 |
加法 |
|
左结合 |
加、减 |
广播加法 |
|
左结合 |
元素级加、减 |
显式转换 |
|
左结合 |
类型或单位转换 |
比较 |
|
不链式 |
数学关系、三态等价查询和显式引用对象同一性 |
广播比较 |
|
不链式 |
元素级比较 |
从属 |
|
不链式 |
集合或容器从属 |
逻辑与 |
|
左结合 |
布尔短路与,或数学关系的逻辑合取 |
逻辑或 |
|
左结合 |
布尔短路或,或数学关系的逻辑析取 |
管道 |
|
左结合 |
函数调用语法糖 |
CAS 替换规则 |
|
固定二元形式 |
左右为数学值,结果为 |
范围外 |
|
由对应语法定义 |
函数类型、绑定、实参绑定、可空标注、矩阵行与切片 |
4. 表达式形式¶
以下表达式形式属于本规范定义的表面语法。
形式 |
示例 |
说明 |
|---|---|---|
函数调用 |
|
支持位置实参和具名实参,按普通声明绑定后检查 |
集合字面量 |
|
有限集合;类型规则由集合规范定义 [2] |
集合推导式 |
|
产生有限集合 |
元组 |
|
固定长度有序组合;类型规则由元组规范定义 [3] |
分组 |
|
单元素圆括号表达式是分组,不是元组 |
函数名后紧跟圆括号时,圆括号内容解析为函数实参列表。
圆括号中的逗号分隔表达式解析为元组;函数名后的圆括号解析为实参列表;方括号中的逗号分隔表达式解析为数组。
区间由标准库的命名构造函数创建 [5]。分组、元组、数组、调用和索引分别保持本节规定的括号语义。
集合字面量 {} 表示空集合时必须由上下文确定元素类型。集合推导式中的 for 和 if 按核心语言推导式规则解析。
4.1 调用与具名实参¶
f(x, precision = 100) 中的 precision = 100 是具名实参。位置实参依声明顺序绑定,具名实参依参数名绑定;位置实参须先于具名实参。调用目标和实参按源码从左到右各求值一次,绑定完成后检查类型、值约束和量纲。
未知参数名、重复绑定同一参数、参数数量错误和遗漏必需参数均须诊断。函数值调用保留原声明的参数绑定信息。具名实参不构造赋值表达式,也不自动产生偏应用。
use std.math.{approximate, sqrt}
let value = approximate(sqrt(2), precision = 100)
4.2 管道¶
x |> f 降级为 f(x),x |> f(a, b) 降级为 f(x, a, b)。先求值左侧一次,再按顺序求值调用目标及其余实参;右侧目标须可调用,完整实参列表按普通调用规则检查。
管道只插入第一个参数;其余参数保持原有位置或名称。首个参数已由右侧具名实参绑定时,按重复绑定报错。该语法不要求通用柯里化,不能先独立执行不完整的 f(a, b)。
4.3 容器与切片¶
普通 [a, b] 构造数组,vec[...] 和 mat[...] 分别构造数学向量和矩阵。矩阵内逗号分隔列或横向块,分号分隔行或纵向块,拼接须满足形状约束。
.. 仅在容器下标中表示含两个端点的索引范围;* 在切片位置选择整轴。具体索引、维度与值语义由核心规范定义 [1],普通数学区间仍使用命名构造函数。
5. 显式乘法¶
Lamina 不提供隐式乘法。任何乘法都必须写出 *。
2 * x # 合法
2x # 非法
2 * (x + 1) # 合法
2(x + 1) # 非法
x * sin(x) # 合法
x sin(x) # 非法
该规则同时适用于 Lamina 源码和任何接收表达式文本的库接口。
6. 优先级¶
优先级从高到低如下:
后缀:
()、.、[]、'、.'幂:
^、.^一元:
+、-、not、!乘法:
*、/、//、%、\、.*、./加法:
+、-、.+、.-显式转换:
as比较:
==、!=、<、<=、>、>=、===、is、.==、.!=、.<、.<=、.>、.>=从属:
in、not in逻辑与:
and逻辑或:
or管道:
|>CAS 替换规则:
=>绑定、赋值和函数箭头
比较、从属和 CAS 替换规则采用二元形式;链式写法产生语法错误,多个条件通过逻辑运算符组合。
a < b < c # 非法
a < b and b < c # 合法
幂先于一元负号结合,-2^2 解析为 -(2^2),(-2)^2 保留显式的负数底数。as 高于比较,and 高于 or。
数学关系的结果为 num,=== 的结果为三态等价状态,is 只适用于有明确引用身份的对象。数学关系可在条件位置判真;未决是诊断,不采用数值真假转换或把未证明判为假。
lhs => rhs 构造专用 rule 值,构造和代入语义由 LSR-016 定义 [4]。
链式写法 a => b => c 产生语法错误;以 rule 作为任一操作数产生类型错误。
规则可以直接作为函数实参或集合元素,例如 std.cas.substitute(x + y, {x => 2, y => 3})。
table{...} 中的 => 作为键值分隔符,由表字面量语法解析为表项。
7. 数学值直接定义¶
数学值直接使用普通源码构造,数值和符号结果共享基本类型 num。函数目标须先按普通名称规则解析;未解释函数通过显式构造器声明 [4]。
import std
use std.cas.{symbolic_function}
sym x
let polynomial = x^2 + 1
let roots set<num> = {-1, 1}
let domain = std.interval_closed_open(0, 1)
let f = symbolic_function("f", 1)
let call = f(x)
数学表达式可以保持精确常量、符号关系或未求值调用。名字绑定、调用实参数量、容器类型和值约束按普通规则检查;期望 num 不使未声明名字自动合法。
本规范不要求标准库提供通用的表达式字符串解析入口。若实现内部或第三方库接收表达式文本,该文本不得扩展本规范列出的运算符 token,乘法仍必须显式写作 *。
8. 保留与禁止¶
以下 token 在核心语言中保留,未定义语义前不得被库代码重新解释:
...?:??::@
以下写法不属于核心运算符:
&&||**隐式乘法
未列入本规范的数学符号
Lamina 源码和表达式文本中的幂运算固定为 ^。
使用未列入本规范的 token 必须产生词法或语法错误。实现不得把未知 token 当作标识符、函数名或库可重载运算符继续解析。