Norm 0.2
Norm 0.2 是泛型多文件基础计算版本。本页是 0.2 的交付契约;语言规范定义最终语义,0.2 只交付其中列出的严格子集,不建立临时的替代语义。
语言
- 用户泛型 class 与顶层泛型函数;
- 参数化字段、参数、返回类型、局部变量与嵌套类型实参;
- 类型位置禁止 raw type,泛型默认不变;
- 调用位置根据实参和期望类型执行精确泛型推断,也允许显式类型实参;
- 参数化类型在运行时保留声明 identity 与有序实际类型参数;
package、显式单名称import、import alias、public、顶层文件私有声明与 class 私有成员;- 同一源码根中的文件先统一收集声明签名,再分析函数体,允许跨文件互相调用和递归。
0.2 不包含泛型 bounds、use-site variance、nullable、interface、继承、泛型数据 enum、switch、异常、反射和 ref<T>。
项目与工具
norm run <entry.norm> 以入口文件选择 main()。应用入口与模块根 package 目录中的 module.norm 同目录;同 package 文件自动加入项目,跨 package 源文件必须由模块配置导出。无模块配置的入口保持单文件脚本模式。
CLI 与 LSP 共享同一个项目语义模型。诊断、类型感知补全、参数提示、自动 import、悬停、跳转定义、引用和重命名支持泛型类型参数及当前源码根中的跨文件符号,并遵循 module 导出、顶层文件私有声明与 class 私有成员可见性。
每次项目分析生成不可变语义快照;同一修订的诊断和语言功能共享该快照。CLI 与 Polyglot 执行共享同一 Bound IR 后端入口,运行错误提供稳定错误码、源码位置和 guest 调用栈。
module.norm 通过零参数 Module module() 返回模块定义。导出名相对于模块名,例如模块 std 的 math.integer 对应 std/math/integer.norm。完整规则见模块系统。
核心库
- 泛型 Array、List、Map、Set、Stack、Queue、Deque 与 Pair;
- Range 与 StringBuilder;
std.math提供用 Norm 实现的abs、min、max、clamp与sign,使用时显式单名称导入;std.testing提供equal、notEqual、isTrue与isFalse判定函数,供 0.2 标准库和验收程序复用;std.collections提供listContains、listCount、reversed与toList;std.text提供repeat与join;- Array、List、Map、Set、Stack、Queue、Deque 与 Range 统一使用
size(),不保留length; - String 使用
byteSize()、codePointSize()与graphemeSize()区分 Unicode 单位; - Map 的
map[key]要求键存在。返回Option<V>的安全查询等待泛型数据 enum 交付,不提供动态get或 null 哨兵。
可执行规格
0.1 的单文件验收程序迁移到参数化集合和 size()。0.2 另外覆盖泛型声明与推断、raw type 拒绝、泛型不变性、跨文件调用与递归、package/import 可见性、跨文件 LSP、运行时参数化类型描述,以及打包后标准库源码的导入与执行。