LSR 014 - 运算符规范

基本信息

  • LSR 编号 014

  • 标题 运算符规范

  • 作者 Ziyang-Bai

  • 状态 草案

  • 类型 标准规范

  • 创建日期 08-11-2026

  • 归属项目 编译器、标准库、CAS

摘要

定义 Lamina 中数学表达式和普通表达式可使用的运算符、分隔符、关键字型运算符、优先级和结合性。Lamina 源码和标准文档示例都必须使用本规范列出的 token。

技术规范

1. 范围

本规范定义 Lamina 源码层运算符集合、调用实参和切片分隔符。数学值的基本静态类型为 num,值约束与支持域由核心规范定义 [1];运算符不决定整数、有理数或符号树的内部表示。

源码运算符统一使用下表 token,接收表达式文本的库接口遵循同一集合。

2. 源码 token

源码中的运算符、分隔符和关键字型运算符由下列 token 组成。保留但未定义语义的 token 在第 8 节单独列出。

类别

token

用途

算术

+、-、*、/、//、%、^

加、减、乘、除、整除、取余、幂

广播算术

.+、.-、.*、./、.^

向量、矩阵或同形状容器的元素级运算

矩阵除法

\

矩阵左除

比较

==、!=、<、<=、>、>=、===、is

数学关系、三态等价查询、显式引用对象同一性

广播比较

.==、.!=、.<、.<=、.>、.>=

向量、矩阵或同形状容器的元素级比较

逻辑

and、or、not、!

逻辑与、逻辑或、逻辑非

集合

in、not in、subset、|、&、xor

从属、子集、并集、交集、对称差

显式转换

as

类型或单位转换

调用与访问

(、)、[、]、.、,, ;

调用、分组、元组、数组、索引、成员访问、参数分隔和矩阵行分隔

线性代数

'、.'

共轭转置、非共轭转置

集合字面量

{、}

集合和集合推导式

切片

..、*

下标中的含端点索引范围、整轴选择

可空标注

?

类型标注中的可空值

CAS 替换规则

=>

表达式中构造专用 rule 值;表字面量中分隔键值

流程与函数

->、|>

函数箭头、管道

绑定

=

绑定、赋值或调用中的具名实参,由各自语法位置决定

以下示例使用合法 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. 运算符表

类别

运算符

结合性

说明

后缀

()、.、[]、'、.'

左结合

调用、成员访问、索引、转置

幂

^、.^

右结合

num、矩阵或元素级幂;默认保持精确值或未求值表达式

一元

+、-、not、!

右结合

正号、负号、逻辑非

乘法

*、/、//、%、\

左结合

乘、除、整除、取余、矩阵左除

广播乘法

.*、./

左结合

元素级乘、除

加法

+、-

左结合

加、减

广播加法

.+、.-

左结合

元素级加、减

显式转换

as

左结合

类型或单位转换

比较

==、!=、<、<=、>、>=、===、is

不链式

数学关系、三态等价查询和显式引用对象同一性

广播比较

.==、.!=、.<、.<=、.>、.>=

不链式

元素级比较

从属

in、not in

不链式

集合或容器从属

逻辑与

and

左结合

布尔短路与,或数学关系的逻辑合取

逻辑或

or

左结合

布尔短路或,或数学关系的逻辑析取

管道

|>

左结合

函数调用语法糖

CAS 替换规则

=>

固定二元形式

左右为数学值,结果为 rule [4]

范围外

->、=、?、;、..

由对应语法定义

函数类型、绑定、实参绑定、可空标注、矩阵行与切片

比较、从属和逻辑运算的完整类型规则由核心语言和集合规范定义 [1] [2]。

4. 表达式形式

以下表达式形式属于本规范定义的表面语法。

形式

示例

说明

函数调用

f(x, y)

支持位置实参和具名实参,按普通声明绑定后检查

集合字面量

{1, 2, x}

有限集合;类型规则由集合规范定义 [2]

集合推导式

{x^2 for x in values}

产生有限集合

元组

(a, b, c)

固定长度有序组合;类型规则由元组规范定义 [3]

分组

(x + 1)

单元素圆括号表达式是分组,不是元组

函数名后紧跟圆括号时,圆括号内容解析为函数实参列表。

圆括号中的逗号分隔表达式解析为元组;函数名后的圆括号解析为实参列表;方括号中的逗号分隔表达式解析为数组。

区间由标准库的命名构造函数创建 [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. 优先级

优先级从高到低如下:

  1. 后缀:()、.、[]、'、.'

  2. 幂:^、.^

  3. 一元:+、-、not、!

  4. 乘法:*、/、//、%、\、.*、./

  5. 加法:+、-、.+、.-

  6. 显式转换:as

  7. 比较:==、!=、<、<=、>、>=、===、is、.==、.!=、.<、.<=、.>、.>=

  8. 从属:in、not in

  9. 逻辑与:and

  10. 逻辑或:or

  11. 管道:|>

  12. CAS 替换规则:=>

  13. 绑定、赋值和函数箭头

比较、从属和 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 当作标识符、函数名或库可重载运算符继续解析。

9. 引用