LSR 008 - 量纲剥离(Unit Stripping)规范¶
基本信息¶
LSR 编号 008
标题 量纲剥离(Unit Stripping)规范
作者 Ziyang-Bai
状态 草案
类型 标准规范
创建日期 04-05-2026
归属项目 编译器、通用
摘要¶
定义带量纲数值到无量纲数值的剥离路径,覆盖 as num 与 as scalar。
技术规范¶
1. 设计目标¶
为带量纲值提供单一、明确、可预测的剥离语法
与现有
as <unit>单位转换保持组合性剥离仅显式触发,精度与安全边界清晰
2. 语法¶
2.1 基础语法¶
expr as num
expr as scalar
规则:
as num:先转换到 SI 基准量值,再移除单位签名as scalar:仅移除单位签名,不进行数值缩放
2.2 与单位转换组合¶
(expr as <target_unit>) as num
规则:先转换到目标单位,再剥离为纯数值。
3. 语义定义¶
3.1 默认基准¶
expr as num采用 SI 基准量值例:
10<km> as num的结果是10000对抽象基单位(如
score、token),as num采用该基单位自身刻度例:
10<score> as num结果为10
3.2 目标单位下剥离¶
若用户希望在某单位刻度下得到纯数值,必须先显式转换单位
例:
(10<km> as <km>) as num结果为10抽象单位之间仅在存在显式比例定义时允许转换
3.3 as scalar 语义¶
expr as scalar保留当前显示刻度,仅移除单位标签例:
10<km> as scalar结果为10适用于符号推导或公式整理,保持当前刻度,降低系数膨胀
3.4 编译期降级(与 LSR-000 对齐)¶
量纲在编译期追踪,运行期普通数值不携带单位标签
as num与as scalar在 Codegen 前应降级为纯数值表达式
4. 类型规则¶
输入必须是带量纲或无量纲的数值类型(
num及其子层级)输出类型为无量纲
num对非数值类型(如
vector,matrix,table,set,text,bool)使用as num或as scalar,编译报错UnitStripTypeMismatch
5. 与外部函数/底层操作的交互¶
5.1 外部函数调用¶
当外部函数仅接受无量纲参数时,调用端必须显式剥离:
let dist = 1200<m>
let raw = dist as num
let r = c_ext_fft(raw)
5.2 位运算/底层数值 API¶
位运算和底层原语仅接受无量纲数值;带量纲值必须先 as num :
let t = 8<s>
let bits = bit_and((t as num), 3)
规则:外部函数若要求保留当前单位刻度数值,使用 as scalar。
6. 安全约束与错误模型¶
UnitStripTypeMismatch: 作用于非数值类型UnitStripOverflow: 剥离过程发生表示范围溢出(实现相关)UnitStripInvalid: 单位转换阶段失败(例无效目标单位)UnitStripLegacySyntax: 使用了废弃语法as num<_>
规则:
单位维度检查由上游运算与
as <unit>阶段完成as num会按 SI 基准缩放后再剥离,as scalar仅剥离标签
7. 语法约束¶
仅允许
expr as num与expr as scalar
8. 示例¶
let speed = 20<m/s>
let raw_si = speed as num # SI 基准量值
let raw_kmh = (speed as <km/h>) as num # km/h 刻度数值
let raw_keep = speed as scalar # 保留当前刻度值
func second2hour(s num<s>) -> num<h> {
return ((s as num) / 3600) as num<h>
}
9. 与其他 LSR 的关系¶
LSR-000:在量纲系统章节引用本规范,定义主入口
LSR-003:扩展接口中若需无量纲实参,可按本规范显式剥离
LSR-007:
===不依赖单位剥离语义,二者正交