Skip to content

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、运行时参数化类型描述,以及打包后标准库源码的导入与执行。

Norm 0.25