豫言 / 技术规范

本篇描述 4cdeca1 的实现。版本与适用边界见基线说明。

标签函数类型

这是当前编译器在独立实现基线之上增加的语言规则。标签属于函数类型,按参数位置核对,检查后擦除。本文与文言稿同步。

签一:语法

「差」乃化(「被减数」为「整数」)而化(「减数」为「整数」)而「整数」也。
「差」者会(「被减数」为「甲」)而会(「减数」为「乙」)而「减」于「甲」于「乙」也。
「差」于(「被减数」为「一零」)于(「减数」为「三」)。

「标签」为 式 是标签项。它可作 化 的定义域、遇 的参数类型、会 的绑定参数、于 的实参或构造器模式实参。标签项在其他位置报错。会 的标签项右边须为局部名称;遇 仍以 者「局部名」 绑定函数体。

标签须为非空名称,数字记号、注释和编译器内部名称不可作标签。标签文字独立于名称环境,局部名可以与标签相同。标签允许重复,各位置的真实参数类型可以不同。

〇为〇 沿用词法与语法语二的通用默认规约,与其他操作符的显式规约关系表保持原状。唯一可解析时可省括号,如 化「值」为「整数」而「整数」、会「值」为「物」而「物」。遇未定义关系时以括号分组;复杂右项也可独立括起。会〇而〇 的首元素只接受标签项;普通 会□而〇 继续处理普通绑定。

签二:类型规则

记普通箭头为 A→B,标签箭头为 ~签:A→B。

规则 普通箭头 标签箭头
形成 A、B 均为类型 A、B 均为类型且标签合法
引入 将局部名按 A 加入环境,按 B 检查体 将局部名按 A 加入环境,按 B 检查体;定义的标签须为签
消去 实参按 A 检查 实参标签须为签,实参值按 A 检查
相等 域与结果逐项相等 标签文字、域与结果逐项相等

遇 在验参数类型后合成函数体类型,按参数有无标签合成相应箭头。标签保持原文,局部变量依原有绑定规则换名。

两种箭头是独立的类型构造。完整标签函数类型可以作为类型别名、参数、返回值、元组项、容器元素或泛型类型实参。变量、条件选择和调用返回的函数值均按完整类型检查。

合一比较标签和子类型。待求类型变量可以解为完整标签函数类型;独立标签项是参数描述,不能作为待求类型变量的解。期望普通回调的位置须接收普通函数;可用普通匿名函数调用标签函数来显式转接。

签三:应用与模式

第 n 个实参对应第 n 个形参,标签与真实类型均逐位检查。带标签位须写同一标签;普通位直接写实参。标签重复时仍按位置处理。

参数组、完全应用、字面右箭头展平、返回函数类型别名另起一组、隐式 承 与 授以 均沿用原有规则。隐式参数为类型参数,标签项不能作为其类型实参。

隐式参数求解预读实参时穿过标签包装,按真实域类型匹配;读取类型的四种入口与一次有序推定规则见类型与模块类四。实参值、构造器子模式与局部变量按剥去标签后的真实类型检查。

签四:擦除与边界

类型检查后调用与模式中的标签包装消失。带类型抽象的域中保留标签,供阶段文件、接口类型、相等与悬停使用,随后随类型标注擦除。标签不参与自由变量、名称查找或换名。

运行时实参顺序、求值交错、尾位置、直接调用与原有整数去装箱保持原规则。构造器字段形、签名类别和宿主边界形按真实类型计算。无体声明按各参数有无标签合成相应匿名函数;宿主字段名和 Wasm 参数形照旧。

JSON 与豫言阶段源码保存标签项和未检查的标签抽象。标签项有一个子式;标签抽象有一个绑定体;检查后的阶段拒绝残留的未检查标签抽象。悬停与文档签名显示 (「标签」为 类型)。

签五:实现范围

普通值函数、匿名函数、值构造器与模式、GC 和底层模式、无体接口签名均适用。首版的类型构造器参数和着色语言遇标签时给出明确诊断。默认值、可变参数、乱序调用、部分应用、标签简写和自动转接均维持既有语言边界。

当前编译器已删除 循□以〇。顶层递归以紧邻的完整签名与定义建立;局部递归写 递归虑。仓内原来 循「名」以 的用例已改用上述签名递归。