LSR 014 - 运算符规范

基本信息

  • LSR 编号 014

  • 标题 运算符规范

  • 作者 Ziyang-Bai

  • 状态 草案

  • 类型 标准规范

  • 创建日期 08-11-2026

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

摘要

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

技术规范

1. 范围

本规范定义 Lamina 源码层运算符集合。标准库函数名、CAS 内部表示和错误消息文本不由本规范强制。

实现不得接受未列入本规范的数学符号作为运算符替代写法。

2. 源码 token

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

类别

token

用途

算术

+-*///%^

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

广播算术

.+.-.*./.^

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

矩阵除法

\\

矩阵左除

比较

==!=<<=>>=

标量相等和顺序关系

广播比较

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

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

逻辑

andornot!

逻辑与、逻辑或、逻辑非

集合

innot insubset|&xor

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

调用与访问

()[].,

调用、分组、元组、数组、索引、成员访问、参数分隔

线性代数

'.'

共轭转置、非共轭转置

集合字面量

{}

集合和集合推导式

流程与函数

=>->|>

Binding 构造、match 分支、函数箭头、管道

绑定

=

绑定或赋值,由语句语法决定

以下示例使用合法 token。

let a = x^2 + 1
let b = x <= y and y != 0
let c = item in values
let d = 2 * x * sin(x)
  • <= 是合法源码运算符

  • != 是合法源码运算符

  • andornot 是逻辑运算关键字

  • &&|| 不属于 Lamina 核心逻辑运算符

  • 乘法必须显式写作 *

3. 运算符表

类别

运算符

结合性

说明

后缀

().[]'.'

左结合

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

^.^

右结合

数值、矩阵、Expr 或元素级幂

一元

+-not!

右结合

正号、负号、逻辑非

乘法

*///%\\

左结合

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

广播乘法

.*./

左结合

元素级乘、除

加法

+-

左结合

加、减

广播加法

.+.-

左结合

元素级加、减

比较

==!=<<=>>=

不链式

标量比较

广播比较

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

不链式

元素级比较

从属

innot in

不链式

集合或容器从属

逻辑与

and

左结合

短路逻辑与

逻辑或

or

左结合

短路逻辑或

管道

|>

左结合

函数调用语法糖

Binding

=>

右结合

表达式位置构造 Binding;match 分支中的 => 由 match 语法接管

范围外

->=

由对应语法定义

函数类型、绑定或赋值

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

4. 表达式形式

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

形式

示例

说明

函数调用

f(x, y)

支持零个、一个或多个参数

集合字面量

{1, 2, x}

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

集合推导式

{x^2 for x in values}

产生有限集合

元组

(a, b, c)

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

分组

(x + 1)

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

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

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

区间由标准库的命名构造函数创建 [6]。分组、元组、数组、调用和索引分别保持本节规定的括号语义。

集合字面量 {} 表示空集合时必须由上下文确定元素类型。集合推导式中的 forif 按核心语言推导式规则解析。

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. 比较:==!=<<=>>=.==.!=.<.<=.>.>=

  7. 从属:innot in

  8. 逻辑与:and

  9. 逻辑或:or

  10. 管道:|>

  11. Binding 构造:=>

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

比较和从属运算不得隐式链式解析。

a < b < c       # 非法
a < b and b < c # 合法

表达式位置的 => 构造 Binding 值,语义由 LSR-011 定义 [5]match 分支中的 => 不按表达式运算符解析,由 LSR-005 定义。

7. Expr 直接定义

Expr 允许由 Lamina 表达式直接定义,不需要通过标准库字符串解析函数创建。

sym x
let expr = x^2 + 1
let roots set<Expr> = {-1, 1}
let domain = std.interval_closed_open(0, 1)
let call = max(x, y, 0)

当期望类型为 Expr 时,数值字面量、符号、函数调用和集合可以构造符号表达式;区间通过普通的标准库函数调用构造。具体提升边界由 LSR-016 定义 [4];本规范只规定可用 token 和表面语法。

本规范不要求标准库提供通用的表达式字符串解析入口。若实现内部或第三方库接收表达式文本,该文本不得扩展本规范列出的运算符 token,乘法仍必须显式写作 *

8. 保留与禁止

以下 token 在核心语言中保留,未定义语义前不得被库代码重新解释:

  • ..

  • ...

  • ?:

  • ??

  • ::

  • @

以下写法不属于核心运算符:

  • &&

  • ||

  • **

  • 隐式乘法

  • 未列入本规范的数学符号

Lamina 源码和表达式文本中的幂运算固定为 ^

使用未列入本规范的 token 必须产生词法或语法错误。实现不得把未知 token 当作标识符、函数名或库可重载运算符继续解析。

9. 引用