LSR 004 - 标准库¶
基本信息¶
LSR 编号 004
标题 标准库
作者 Ziyang-Bai
状态 草案
类型 标准规范
创建日期 02-04-2026
归属项目 通用
摘要¶
定义 Lamina 标准库(std )的模块结构、导入与调用规则、数学核心 API 和错误模型。
技术规范¶
1. 设计目标¶
统一、稳定、可组合的标准 API
对齐 LSR-000 的静态强类型与单位系统
覆盖数学核心能力(数值、线代、统计、随机、单位)
同名函数跨平台语义一致
2. 命名空间与模块结构¶
标准库顶级命名空间固定为 std。
模块 |
作用域 |
说明 |
|---|---|---|
|
通用数学 |
初等函数、三角函数、指数对数、舍入、数值辅助 |
|
线性代数 |
矩阵分解、求解、逆、行列式、特征值 |
|
统计 |
描述统计、分位数、协方差、相关系数 |
|
随机数 |
伪随机引擎、分布采样、种子控制 |
|
单位工具 |
单位转换辅助与量纲工具函数 |
|
常量集 |
统一暴露 LSR-002 常量 |
|
基础 I/O |
文本输入输出与格式化 |
规则:
模块名称与路径大小写敏感
std根命名空间保留;用户模块定义在非std命名空间
3. 导入与库调用约定¶
3.1 导入语法¶
import std.math
import std.linalg as la
use std.math.{sin, cos, pi}
use std.constants.{G as GRAVITY}
规则:
import a.b绑定模块对象到当前作用域(默认名为末段标识符)import a.b as x使用别名绑定模块对象use a.b.{x, y as z}导入符号;若与当前作用域重名则编译报错
3.2 调用约定¶
let y = math.sin(math.pi / 2)
let detA = la.det(A)
规则:
模块函数调用统一使用
module.func(args...)对
use导入的符号可直接调用标准库函数以纯函数语义为默认,参数只读
3.3 . 规则¶
. 用于命名空间路径与成员访问;import/use 中路径与符号选择均使用 .。
import std.math
use std.math.{sin, cos}
let a = math.sin(pi / 2) # '.' 成员访问
let b = sin(pi / 2) # 通过 use 导入后可直接访问
规则:
import a.b/use a.b.{...}中的.表示命名空间路径运行期表达式的
a.b表示成员访问(模块对象、表、对象)
4. 数学系统¶
4.1 std.math¶
函数 |
签名 |
说明 |
|---|---|---|
|
|
绝对值 |
|
|
平方根 |
|
|
幂 |
|
|
指数函数 |
|
|
自然对数 |
|
|
常用对数 |
|
|
正弦 |
|
|
余弦 |
|
|
正切 |
|
|
反正弦 |
|
|
反余弦 |
|
|
反正切 |
|
|
向下取整 |
|
|
向上取整 |
|
|
四舍五入 |
|
|
截断到区间 |
常量:pi, e, phi。
4.2 std.linalg¶
函数 |
签名 |
说明 |
|---|---|---|
|
|
返回维度 |
|
|
非共轭转置 |
|
|
共轭转置 |
|
|
行列式(方阵) |
|
|
矩阵逆(方阵) |
|
|
矩阵秩 |
|
|
迹 |
|
|
解 |
|
|
解 |
|
|
特征值/特征向量 |
|
|
奇异值分解 |
语义对齐:
solve_left(A, B)与运算符A \\ B等价solve_right(B, A)与运算符B / A(矩阵语义)等价
4.3 std.stats¶
函数 |
签名 |
说明 |
|---|---|---|
|
|
均值 |
|
|
中位数 |
|
|
方差 |
|
|
标准差 |
|
|
分位数 |
|
|
协方差 |
|
|
相关系数 |
4.4 std.random¶
函数 |
签名 |
说明 |
|---|---|---|
|
|
设置随机种子 |
|
|
|
|
|
区间整数采样 |
|
|
正态采样 |
|
|
离散采样 |
4.5 std.units¶
函数 |
签名 |
说明 |
|---|---|---|
|
|
将数值转换到单位字符串 |
|
|
等价于 |
|
|
是否无量纲 |
规则:strip 只是函数入口,语义以 LSR-008 为准。
5. 常量系统¶
std.constants暴露 LSR-002 定义的常量集合常量以只读绑定导出
常量单位必须与 LSR-000 量纲系统一致
5.1 用户自定义常量¶
用户可在模块内定义常量:
module user.constants {
const G_MARS = 3.72076<m/s^2>
const TAU = 2 * pi
}
规则:
const必须在声明时初始化初始化表达式必须可在编译期求值
常量为只读绑定;编译期校验覆盖重定义与写入
5.2 用户自定义单位¶
用户可在模块内定义单位:
module user.units {
unit score
unit token
unit km = 1000<m>
unit min = 60<s>
unit knot = 0.514444<m/s>
unit level = 100<score>
}
规则:
unit声明进入当前命名空间允许定义抽象基单位(不归约到 SI)
派生单位必须可归约到已知单位(SI 或抽象基单位)
可通过
import/use跨模块复用
示例:
use std.constants.{G, C, EARTH_GRAVITY}
let v = EARTH_GRAVITY * 2<s>
6. 错误模型¶
标准库错误采用可诊断错误码,至少覆盖:
DomainError:输入超出定义域(如log(-1))DimensionMismatch:线代/广播维度不匹配SingularMatrix:矩阵奇异或线性系统奇异EmptyInput:统计函数输入为空InvalidArgument:参数类型或取值非法
7. 性能与确定性约束¶
同版本标准库在同一输入下必须给出可重现结果(随机模块除外)
std.random在固定种子下必须可重放线性代数实现允许后端差异,但数值误差须在文档化容差内
8. 版本与稳定性¶
std下 API 采用语义化版本管理对外函数签名变更属于破坏性变更,需提升主版本
新增函数保持向后兼容调用行为;既有函数语义保持稳定
9. 示例¶
import std.math
import std.linalg as la
use std.stats.{mean, std}
use std.units.{strip}
let A = mat[2,1;1,3]
let B = mat[1;2]
let X = A \\ B
let angle = math.pi / 4
let s = math.sin(angle)
let speed = 36<km/h>
let raw_si = strip(speed as <m/s>)
let xs = vec[1,2,3,4,5]
let m = mean(xs)
let sd = std(xs)
10. 与其他 LSR 的关系¶
LSR-000:语言核心语法与运算符语义
LSR-002:标准常量定义来源
LSR-003:标准库可由扩展模块补充实现
LSR-008:
as num量纲剥离语义来源LSR-009:多个同类标准库结果使用
set<T>表示LSR-010:
std.math复数常量与复数函数语义来源