|
| 1 | +# CodeNothing 枚举类型特性 - v0.4.7 |
| 2 | + |
| 3 | +## 概述 |
| 4 | + |
| 5 | +CodeNothing v0.4.7 版本新增了完整的枚举类型支持,提供了类似 Rust 的强大枚举功能。枚举类型允许定义一组命名的变体,每个变体可以包含不同类型和数量的数据。 |
| 6 | + |
| 7 | +经过全面的测试验证,enum功能已经达到生产可用水平,支持从简单的状态枚举到复杂的数据建模场景。本版本包含了完整的类型安全检查、方法调用支持、字符串操作集成等核心功能。 |
| 8 | + |
| 9 | +## 语法特性 |
| 10 | + |
| 11 | +### 1. 基础枚举定义 |
| 12 | + |
| 13 | +```codenothing |
| 14 | +enum Color { |
| 15 | + Red, |
| 16 | + Green, |
| 17 | + Blue |
| 18 | +}; |
| 19 | +``` |
| 20 | + |
| 21 | +### 2. 带参数的枚举定义 |
| 22 | + |
| 23 | +```codenothing |
| 24 | +enum Shape { |
| 25 | + Circle(float), // 单参数变体 |
| 26 | + Rectangle(float, float), // 多参数变体 |
| 27 | + Triangle(float, float, float) // 三参数变体 |
| 28 | +}; |
| 29 | +``` |
| 30 | + |
| 31 | +### 3. 混合类型枚举 |
| 32 | + |
| 33 | +```codenothing |
| 34 | +enum Message { |
| 35 | + Quit, // 无参数变体 |
| 36 | + Move(int, int), // 整数参数 |
| 37 | + Write(string), // 字符串参数 |
| 38 | + ChangeColor(int, int, int) // 多个整数参数 |
| 39 | +}; |
| 40 | +``` |
| 41 | + |
| 42 | +### 4. 枚举变体创建 |
| 43 | + |
| 44 | +```codenothing |
| 45 | +// 无参数变体 |
| 46 | +red : Color = Color::Red; |
| 47 | +
|
| 48 | +// 带参数变体 |
| 49 | +circle : Shape = Shape::Circle(5.0); |
| 50 | +rectangle : Shape = Shape::Rectangle(10.0, 20.0); |
| 51 | +
|
| 52 | +// 复杂变体 |
| 53 | +move_msg : Message = Message::Move(10, 20); |
| 54 | +write_msg : Message = Message::Write("Hello, World!"); |
| 55 | +``` |
| 56 | + |
| 57 | +## 实现特性 |
| 58 | + |
| 59 | +### 1. 类型安全 |
| 60 | +- ✅ 枚举变体在运行时进行严格类型检查 |
| 61 | +- ✅ 参数数量和类型必须与定义匹配,否则抛出运行时错误 |
| 62 | +- ✅ 支持强类型的枚举变量声明和智能类型推断 |
| 63 | +- ✅ 自动识别Class类型声明中的enum值 |
| 64 | + |
| 65 | +### 2. 字符串表示和操作 |
| 66 | +- ✅ 无参数变体:`EnumName::VariantName` |
| 67 | +- ✅ 带参数变体:`EnumName::VariantName(arg1, arg2, ...)` |
| 68 | +- ✅ 支持与字符串的连接操作(`+` 运算符) |
| 69 | +- ✅ 支持字符串方法调用:`startsWith()`, `endsWith()`, `contains()` |
| 70 | + |
| 71 | +### 3. 方法调用支持 |
| 72 | +- ✅ `toString()`:返回枚举的字符串表示 |
| 73 | +- ✅ `getEnumName()`:返回枚举类型名称 |
| 74 | +- ✅ `getVariantName()`:返回枚举变体名称 |
| 75 | +- ✅ `length()`:返回枚举字段数量 |
| 76 | + |
| 77 | +### 4. 函数系统集成 |
| 78 | +- ✅ 枚举可以作为函数参数,支持类型检查 |
| 79 | +- ✅ 枚举可以作为函数返回值,支持返回值类型验证 |
| 80 | +- ✅ 支持在函数间传递枚举值,保持类型安全 |
| 81 | +- ✅ 支持枚举变量的赋值和重新赋值 |
| 82 | + |
| 83 | +### 5. 命名空间支持 |
| 84 | +- ✅ 枚举变体使用 `::` 语法访问,与现有语法一致 |
| 85 | +- ✅ 与现有的命名空间系统完全兼容 |
| 86 | +- ✅ 支持枚举名称的作用域解析 |
| 87 | +- ✅ 自动区分枚举变体创建和命名空间函数调用 |
| 88 | + |
| 89 | +## 技术实现 |
| 90 | + |
| 91 | +### 1. AST 扩展 |
| 92 | +- ✅ 新增 `Enum`、`EnumVariant`、`EnumField` 结构体 |
| 93 | +- ✅ 扩展 `Type` 枚举以支持 `Enum(String)` 类型 |
| 94 | +- ✅ 新增 `EnumVariantCreation` 和 `EnumVariantAccess` 表达式类型 |
| 95 | +- ✅ 在 `Program` 结构体中添加 `enums` 字段存储枚举定义 |
| 96 | + |
| 97 | +### 2. 解析器支持 |
| 98 | +- ✅ 新增 `enum_parser.rs` 模块,实现完整的枚举语法解析 |
| 99 | +- ✅ 支持命名字段和匿名字段的解析 |
| 100 | +- ✅ 集成到主程序解析器和语句解析器中 |
| 101 | +- ✅ 支持复杂参数类型的解析(int, float, string, bool等) |
| 102 | + |
| 103 | +### 3. 解释器支持 |
| 104 | +- ✅ 新增 `EnumInstance` 值类型,包含枚举名、变体名和字段值 |
| 105 | +- ✅ 实现枚举变体的创建和访问逻辑 |
| 106 | +- ✅ 支持严格的类型检查和运行时验证 |
| 107 | +- ✅ 在解释器初始化时注册所有枚举定义 |
| 108 | + |
| 109 | +### 4. 表达式求值增强 |
| 110 | +- ✅ 支持枚举变体的创建表达式求值 |
| 111 | +- ✅ 支持枚举变体的访问表达式求值 |
| 112 | +- ✅ 集成到现有的表达式求值系统 |
| 113 | +- ✅ 新增 `handle_enum_method` 方法处理枚举方法调用 |
| 114 | + |
| 115 | +### 5. 函数调用系统改进 |
| 116 | +- ✅ 在命名空间函数调用中添加枚举变体创建检测 |
| 117 | +- ✅ 优先处理枚举变体创建而非函数调用 |
| 118 | +- ✅ 支持复杂参数的枚举变体创建 |
| 119 | + |
| 120 | +### 6. 字符串方法扩展 |
| 121 | +- ✅ 新增 `startsWith()` 方法支持 |
| 122 | +- ✅ 新增 `endsWith()` 方法支持 |
| 123 | +- ✅ 新增 `contains()` 方法支持 |
| 124 | +- ✅ 完善字符串操作与枚举的集成 |
| 125 | + |
| 126 | +## 测试验证结果 |
| 127 | + |
| 128 | +### 1. 功能测试覆盖 |
| 129 | +- ✅ **基础枚举测试**:简单枚举定义、创建和使用 |
| 130 | +- ✅ **参数枚举测试**:带参数的枚举变体创建和处理 |
| 131 | +- ✅ **复杂枚举测试**:多参数、混合类型的枚举变体 |
| 132 | +- ✅ **方法调用测试**:所有内置方法的功能验证 |
| 133 | +- ✅ **字符串操作测试**:枚举与字符串的各种操作 |
| 134 | +- ✅ **函数集成测试**:枚举作为参数和返回值的使用 |
| 135 | + |
| 136 | +### 2. 性能测试结果 |
| 137 | +- ✅ **大量创建测试**:成功创建1000+个枚举实例 |
| 138 | +- ✅ **复杂参数测试**:支持最多10个参数的枚举变体 |
| 139 | +- ✅ **字符串转换测试**:100次toString()调用性能稳定 |
| 140 | +- ✅ **函数传递测试**:100次函数调用传递枚举值正常 |
| 141 | + |
| 142 | +### 3. 边界情况测试 |
| 143 | +- ✅ **空字符串参数**:正确处理空字符串作为枚举参数 |
| 144 | +- ✅ **零值参数**:正确处理0值作为枚举参数 |
| 145 | +- ✅ **长字符串参数**:支持长文本内容作为枚举参数 |
| 146 | +- ✅ **特殊字符处理**:正确处理特殊字符和Unicode字符 |
| 147 | +- ✅ **枚举重新赋值**:支持枚举变量的多次重新赋值 |
| 148 | + |
| 149 | +### 4. 业务场景验证 |
| 150 | +- ✅ **HTTP响应处理**:模拟API响应状态的枚举使用 |
| 151 | +- ✅ **用户权限系统**:权限级别的枚举建模 |
| 152 | +- ✅ **文件操作结果**:文件系统操作结果的枚举表示 |
| 153 | +- ✅ **游戏状态机**:复杂游戏状态转换的枚举应用 |
| 154 | +- ✅ **JSON数据建模**:JSON值类型的枚举表示 |
| 155 | + |
| 156 | +## 使用示例 |
| 157 | + |
| 158 | +### Option 类型模拟 |
| 159 | + |
| 160 | +```codenothing |
| 161 | +enum Option { |
| 162 | + Some(string), |
| 163 | + None |
| 164 | +}; |
| 165 | +
|
| 166 | +fn processOption(opt : Option) : void { |
| 167 | + std::println("处理 Option: " + opt); |
| 168 | +}; |
| 169 | +
|
| 170 | +some_value : Option = Option::Some("有值"); |
| 171 | +none_value : Option = Option::None; |
| 172 | +
|
| 173 | +processOption(some_value); |
| 174 | +processOption(none_value); |
| 175 | +``` |
| 176 | + |
| 177 | +### 状态机实现 |
| 178 | + |
| 179 | +```codenothing |
| 180 | +enum State { |
| 181 | + Idle, |
| 182 | + Running(int), |
| 183 | + Paused(int, string), |
| 184 | + Stopped |
| 185 | +}; |
| 186 | +
|
| 187 | +fn handleState(state : State) : void { |
| 188 | + std::println("当前状态: " + state); |
| 189 | +}; |
| 190 | +
|
| 191 | +current_state : State = State::Running(100); |
| 192 | +handleState(current_state); |
| 193 | +
|
| 194 | +current_state = State::Paused(50, "用户暂停"); |
| 195 | +handleState(current_state); |
| 196 | +``` |
| 197 | + |
| 198 | +## 限制和注意事项 |
| 199 | + |
| 200 | +### 1. 已知限制 |
| 201 | +- ❌ **负数字面量**:解析器暂不支持负数字面量(如-42.5)作为枚举参数 |
| 202 | +- ❌ **模式匹配**:暂不支持模式匹配语法(计划在后续版本中实现) |
| 203 | +- ❌ **命名字段**:枚举字段暂不支持命名字段(仅支持位置参数) |
| 204 | +- ❌ **枚举继承**:不支持枚举的继承或实现接口 |
| 205 | +- ❌ **数组类型解析**:数组类型声明中暂不支持enum类型 |
| 206 | + |
| 207 | +### 2. 语法限制 |
| 208 | +- ⚠️ **注释问题**:单行注释(//)在某些上下文中可能有解析问题,建议使用多行注释 |
| 209 | +- ⚠️ **复杂表达式**:在enum参数中使用复杂表达式可能有限制 |
| 210 | + |
| 211 | +### 3. 性能考虑 |
| 212 | +- ⚠️ **运行时存储**:枚举值在运行时存储为动态结构,有一定内存开销 |
| 213 | +- ⚠️ **字符串生成**:字符串表示在需要时动态生成,频繁调用toString()可能影响性能 |
| 214 | +- ⚠️ **类型检查开销**:类型检查在赋值时进行,有一定运行时开销 |
| 215 | + |
| 216 | +### 4. 兼容性保证 |
| 217 | +- ✅ 与现有的类型系统完全兼容 |
| 218 | +- ✅ 不影响现有代码的运行 |
| 219 | +- ✅ 可以与类、接口、命名空间等特性混合使用 |
| 220 | +- ✅ 向后兼容,不破坏现有API |
| 221 | + |
| 222 | +## 未来计划 |
| 223 | + |
| 224 | +### 1. 模式匹配 |
| 225 | +计划在下一个版本中实现对枚举的模式匹配支持: |
| 226 | + |
| 227 | +```codenothing |
| 228 | +// 计划中的语法 |
| 229 | +match (shape) { |
| 230 | + Shape::Circle(radius) => { |
| 231 | + std::println("圆形,半径: " + radius); |
| 232 | + }, |
| 233 | + Shape::Rectangle(width, height) => { |
| 234 | + std::println("矩形,宽: " + width + ",高: " + height); |
| 235 | + }, |
| 236 | + _ => { |
| 237 | + std::println("其他形状"); |
| 238 | + } |
| 239 | +}; |
| 240 | +``` |
| 241 | + |
| 242 | +### 2. 命名字段 |
| 243 | +计划支持结构体式的枚举字段: |
| 244 | + |
| 245 | +```codenothing |
| 246 | +// 计划中的语法 |
| 247 | +enum Person { |
| 248 | + Student { name: string, grade: int }, |
| 249 | + Teacher { name: string, subject: string } |
| 250 | +}; |
| 251 | +``` |
| 252 | + |
| 253 | +### 3. 枚举方法 |
| 254 | +计划支持为枚举定义方法: |
| 255 | + |
| 256 | +```codenothing |
| 257 | +// 计划中的语法 |
| 258 | +enum Shape { |
| 259 | + Circle(float), |
| 260 | + Rectangle(float, float) |
| 261 | +} { |
| 262 | + fn area(self) : float { |
| 263 | + // 方法实现 |
| 264 | + }; |
| 265 | +}; |
| 266 | +``` |
| 267 | + |
| 268 | +## 总结 |
| 269 | + |
| 270 | +CodeNothing v0.4.7 版本的枚举类型实现是一个重要的里程碑,标志着语言功能的显著提升: |
| 271 | + |
| 272 | +### 主要成就 |
| 273 | +- ✅ **完整功能**:实现了从基础枚举到复杂多参数枚举的完整支持 |
| 274 | +- ✅ **类型安全**:提供了严格的类型检查和运行时验证机制 |
| 275 | +- ✅ **实用性强**:通过大量测试验证,可在真实业务场景中使用 |
| 276 | +- ✅ **性能稳定**:支持大量枚举实例创建和复杂操作 |
| 277 | +- ✅ **集成良好**:与现有语言特性无缝集成 |
| 278 | + |
| 279 | +### 技术价值 |
| 280 | +枚举类型的加入使 CodeNothing 语言更加强大和表达力丰富。它提供了一种类型安全的方式来表示具有多种可能状态的数据,是函数式编程和现代语言设计的重要特性。 |
| 281 | + |
| 282 | +### 未来展望 |
| 283 | +这个特性为 CodeNothing 语言的类型系统奠定了坚实的基础,为后续实现更高级的特性(如模式匹配、泛型、代数数据类型等)做好了准备。 |
| 284 | + |
| 285 | +### 开发者反馈 |
| 286 | +欢迎开发者使用enum功能并提供反馈。相关示例代码可在 `examples/` 目录中找到: |
| 287 | +- `examples/enum_test.cn` - 基础功能演示 |
| 288 | +- `examples/enum_complex_test.cn` - 复杂场景应用 |
| 289 | +- `examples/enum_final_test.cn` - 综合功能测试 |
0 commit comments