Lobsters | 📄 原文链接 | 2026-11-03 收录 · 热度 5

联合类型与可选类型:在一门「更好的 C」里的取舍

来源:tibleiz.net — 2025-03-16

📋 概述

Marc Kerbiquet 记录他在自研的「更好的 C」语言 Copper 里试验联合类型的结果。联合类型是「值可以是这几种类型之一」的列表,一般要先判别实际类型才能使用。他在 Copper 里用标签处理一般情形,却为 Pointer|Nothing 做了零开销特例:不附加标签、用 NULL 判别,既快又好和外部 C 库对接。为了让编译高效,他加了三条限制:不允许嵌套联合((T1|T2)|T3)、顺序有意义(T1|T2 与 T2|T1 不同,但换来了 File|Error 的首类型短路糖)、不同联合之间不兼容(否则要给类型分配全局唯一标签)。结论是复杂度对一门极简语言来说太高,尤其那个优化特例;他实际只用得上 T|Nothing 与 T|Error,于是转向只做可选类型 T?:每种类型自己保留一个 nil 值(指针用 0,24 位色彩可留 0x8000_0000,无符号索引留 -1),并用 expr as id 在确认非 nil 时把值复制进一个隐藏作用域的不可变变量,再配 or else 解决箭头式嵌套。

🔑 核心要点

💡 金句

可选类型的要点是:在确认它不是 nil 之前,你不能把它当成主类型的值来用。
← 返回 Lobsters 首页