LSR 014 - 运算符规范 ================================================================================ 基本信息 -------------------------------------------------------------------------------- - LSR 编号 014 - 标题 运算符规范 - 作者 Ziyang-Bai - 状态 草案 - 类型 标准规范 - 创建日期 08-11-2026 - 归属项目 编译器、标准库、CAS 摘要 -------------------------------------------------------------------------------- 定义 Lamina 中数学表达式和普通表达式可使用的运算符、分隔符、关键字型运算符、优先级和结合性。Lamina 源码和标准文档示例都必须使用本规范列出的 token。 技术规范 -------------------------------------------------------------------------------- 1. 范围 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本规范定义 Lamina 源码层运算符集合。标准库函数名、CAS 内部表示和错误消息文本不由本规范强制。 实现不得接受未列入本规范的数学符号作为运算符替代写法。 2. 源码 token ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 源码中的运算符、分隔符和关键字型运算符由下列 token 组成。保留但未定义语义的 token 在第 8 节单独列出。 .. list-table:: :header-rows: 1 * - 类别 - token - 用途 * - 算术 - ``+``、``-``、``*``、``/``、``//``、``%``、``^`` - 加、减、乘、除、整除、取余、幂 * - 广播算术 - ``.+``、``.-``、``.*``、``./``、``.^`` - 向量、矩阵或同形状容器的元素级运算 * - 矩阵除法 - ``\\`` - 矩阵左除 * - 比较 - ``==``、``!=``、``<``、``<=``、``>``、``>=`` - 标量相等和顺序关系 * - 广播比较 - ``.==``、``.!=``、``.<``、``.<=``、``.>``、``.>=`` - 向量、矩阵或同形状容器的元素级比较 * - 逻辑 - ``and``、``or``、``not``、``!`` - 逻辑与、逻辑或、逻辑非 * - 集合 - ``in``、``not in``、``subset``、``|``、``&``、``xor`` - 从属、子集、并集、交集、对称差 * - 调用与访问 - ``(``、``)``、``[``、``]``、``.``、``,`` - 调用、分组、元组、数组、索引、成员访问、参数分隔 * - 线性代数 - ``'``、``.'`` - 共轭转置、非共轭转置 * - 集合字面量 - ``{``、``}`` - 集合和集合推导式 * - 流程与函数 - ``=>``、``->``、``|>`` - Binding 构造、match 分支、函数箭头、管道 * - 绑定 - ``=`` - 绑定或赋值,由语句语法决定 以下示例使用合法 token。 .. code-block:: text let a = x^2 + 1 let b = x <= y and y != 0 let c = item in values let d = 2 * x * sin(x) - ``<=`` 是合法源码运算符 - ``!=`` 是合法源码运算符 - ``and``、``or``、``not`` 是逻辑运算关键字 - ``&&``、``||`` 不属于 Lamina 核心逻辑运算符 - 乘法必须显式写作 ``*`` 3. 运算符表 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. list-table:: :header-rows: 1 * - 类别 - 运算符 - 结合性 - 说明 * - 后缀 - ``()``、``.``、``[]``、``'``、``.'`` - 左结合 - 调用、成员访问、索引、转置 * - 幂 - ``^``、``.^`` - 右结合 - 数值、矩阵、``Expr`` 或元素级幂 * - 一元 - ``+``、``-``、``not``、``!`` - 右结合 - 正号、负号、逻辑非 * - 乘法 - ``*``、``/``、``//``、``%``、``\\`` - 左结合 - 乘、除、整除、取余、矩阵左除 * - 广播乘法 - ``.*``、``./`` - 左结合 - 元素级乘、除 * - 加法 - ``+``、``-`` - 左结合 - 加、减 * - 广播加法 - ``.+``、``.-`` - 左结合 - 元素级加、减 * - 比较 - ``==``、``!=``、``<``、``<=``、``>``、``>=`` - 不链式 - 标量比较 * - 广播比较 - ``.==``、``.!=``、``.<``、``.<=``、``.>``、``.>=`` - 不链式 - 元素级比较 * - 从属 - ``in``、``not in`` - 不链式 - 集合或容器从属 * - 逻辑与 - ``and`` - 左结合 - 短路逻辑与 * - 逻辑或 - ``or`` - 左结合 - 短路逻辑或 * - 管道 - ``|>`` - 左结合 - 函数调用语法糖 * - Binding - ``=>`` - 右结合 - 表达式位置构造 ``Binding``;match 分支中的 ``=>`` 由 match 语法接管 * - 范围外 - ``->``、``=`` - 由对应语法定义 - 函数类型、绑定或赋值 比较、从属和逻辑运算的完整类型规则由核心语言和集合规范定义 [1]_ [2]_。 4. 表达式形式 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 以下表达式形式属于本规范定义的表面语法。 .. list-table:: :header-rows: 1 * - 形式 - 示例 - 说明 * - 函数调用 - ``f(x, y)`` - 支持零个、一个或多个参数 * - 集合字面量 - ``{1, 2, x}`` - 有限集合;类型规则由集合规范定义 [2]_ * - 集合推导式 - ``{x^2 for x in values}`` - 产生有限集合 * - 元组 - ``(a, b, c)`` - 固定长度有序组合;类型规则由元组规范定义 [3]_ * - 分组 - ``(x + 1)`` - 单元素圆括号表达式是分组,不是元组 函数名后紧跟圆括号时,圆括号内容解析为函数实参列表。 圆括号中的逗号分隔表达式解析为元组;函数名后的圆括号解析为实参列表;方括号中的逗号分隔表达式解析为数组。 区间由标准库的命名构造函数创建 [6]_。分组、元组、数组、调用和索引分别保持本节规定的括号语义。 集合字面量 ``{}`` 表示空集合时必须由上下文确定元素类型。集合推导式中的 ``for`` 和 ``if`` 按核心语言推导式规则解析。 5. 显式乘法 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Lamina 不提供隐式乘法。任何乘法都必须写出 ``*``。 .. code-block:: text 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. 从属:``in``、``not in`` 8. 逻辑与:``and`` 9. 逻辑或:``or`` 10. 管道:``|>`` 11. Binding 构造:``=>`` 12. 绑定、赋值和函数箭头 比较和从属运算不得隐式链式解析。 .. code-block:: text a < b < c # 非法 a < b and b < c # 合法 表达式位置的 ``=>`` 构造 ``Binding`` 值,语义由 LSR-011 定义 [5]_。 ``match`` 分支中的 ``=>`` 不按表达式运算符解析,由 LSR-005 定义。 7. Expr 直接定义 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``Expr`` 允许由 Lamina 表达式直接定义,不需要通过标准库字符串解析函数创建。 .. code-block:: text sym x let expr = x^2 + 1 let roots set = {-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. 引用 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. [1] :doc:`LSR-000 - Lamina 核心语言规范(草案) ` - 定义核心表达式、绑定、控制流和基础类型 .. [2] :doc:`LSR-013 - 集合类型规范 ` - 定义 ``in``、``not in``、集合运算和集合相等 .. [3] :doc:`LSR-012 - 元组类型规范 ` - 定义元组字面量、元组类型和位置访问 .. [4] :doc:`LSR-016 - Expr 构造与提升规范 ` - 定义 ``Expr`` 的直接构造、自动提升和函数调用解析 .. [5] :doc:`LSR-011 - 代数数据类型规范 ` - 定义 ``Binding`` ADT 与表达式位置的 ``=>`` .. [6] :doc:`LSR-017 - 区间类型规范 ` - 定义标准库命名构造函数、区间类型和成员判断