|
| 1 | +# CodeNothing 泛型 |
| 2 | + |
| 3 | +## 概述 |
| 4 | + |
| 5 | +本文档描述了 CodeNothing 编程语言中泛型系统的实现。泛型系统允许编写可重用的代码,支持类型参数化的函数、类、枚举和接口。 |
| 6 | + |
| 7 | +## CodeNothing 现有的类型系统 |
| 8 | + |
| 9 | +CodeNothing 已经具备了强大的类型系统,包括: |
| 10 | + |
| 11 | +### 现有的变量声明语法 |
| 12 | +- **显式类型声明**:`name: type = value` |
| 13 | +- **自动类型推断**:`name: auto = value` |
| 14 | + |
| 15 | +### 示例 |
| 16 | +```codenothing |
| 17 | +// 显式类型声明 |
| 18 | +x: int = 42; |
| 19 | +y: float = 3.14; |
| 20 | +z: string = "Hello"; |
| 21 | +
|
| 22 | +// 自动类型推断 |
| 23 | +a: auto = 100; // 推断为 int |
| 24 | +b: auto = 2.71; // 推断为 float |
| 25 | +c: auto = "World"; // 推断为 string |
| 26 | +``` |
| 27 | + |
| 28 | +## 已实现的功能 |
| 29 | + |
| 30 | +### 1. AST 扩展 |
| 31 | + |
| 32 | +#### 泛型参数 (GenericParameter) |
| 33 | +```rust |
| 34 | +pub struct GenericParameter { |
| 35 | + pub name: String, // 类型参数名 (如 T, U, K) |
| 36 | + pub constraints: Vec<TypeConstraint>, // 类型约束 |
| 37 | + pub default_type: Option<Type>, // 默认类型 |
| 38 | +} |
| 39 | +``` |
| 40 | + |
| 41 | +#### 类型约束 (TypeConstraint) |
| 42 | +```rust |
| 43 | +pub enum TypeConstraint { |
| 44 | + Trait(String), // trait 约束 |
| 45 | + Sized, // Sized 约束 |
| 46 | + Copy, // Copy 约束 |
| 47 | + Send, // Send 约束 |
| 48 | + Sync, // Sync 约束 |
| 49 | +} |
| 50 | +``` |
| 51 | + |
| 52 | +#### 泛型类型 (Type 扩展) |
| 53 | +```rust |
| 54 | +pub enum Type { |
| 55 | + // ... 现有类型 ... |
| 56 | + Generic(String), // 泛型类型参数 T |
| 57 | + GenericClass(String, Vec<Type>), // 泛型类 Container<T> |
| 58 | + GenericEnum(String, Vec<Type>), // 泛型枚举 Option<T> |
| 59 | +} |
| 60 | +``` |
| 61 | + |
| 62 | +#### 泛型表达式 (Expression 扩展) |
| 63 | +```rust |
| 64 | +pub enum Expression { |
| 65 | + // ... 现有表达式 ... |
| 66 | + GenericFunctionCall(String, Vec<Type>, Vec<Expression>), // 泛型函数调用 |
| 67 | + GenericMethodCall(Box<Expression>, String, Vec<Type>, Vec<Expression>), // 泛型方法调用 |
| 68 | + GenericObjectCreation(String, Vec<Type>, Vec<Expression>), // 泛型对象创建 |
| 69 | + TypeCast(Box<Expression>, Type), // 类型转换 |
| 70 | + TypeOf(Box<Expression>), // 类型查询 |
| 71 | +} |
| 72 | +``` |
| 73 | + |
| 74 | +### 2. 语法支持 |
| 75 | + |
| 76 | +#### 泛型函数 |
| 77 | +```codenothing |
| 78 | +fn max<T>(a: T, b: T) : T { |
| 79 | + if (a > b) { |
| 80 | + return a; |
| 81 | + } else { |
| 82 | + return b; |
| 83 | + }; |
| 84 | +}; |
| 85 | +``` |
| 86 | + |
| 87 | +#### 泛型类 |
| 88 | +```codenothing |
| 89 | +class Container<T> { |
| 90 | + private T value; |
| 91 | + |
| 92 | + constructor<T>(T initial_value) { |
| 93 | + this.value = initial_value; |
| 94 | + }; |
| 95 | + |
| 96 | + fn get<T>() : T { |
| 97 | + return this.value; |
| 98 | + }; |
| 99 | + |
| 100 | + fn set<T>(T new_value) : void { |
| 101 | + this.value = new_value; |
| 102 | + }; |
| 103 | +}; |
| 104 | +``` |
| 105 | + |
| 106 | +#### 泛型枚举 |
| 107 | +```codenothing |
| 108 | +enum Option<T> { |
| 109 | + Some(T value), |
| 110 | + None |
| 111 | +}; |
| 112 | +``` |
| 113 | + |
| 114 | +#### 泛型接口 |
| 115 | +```codenothing |
| 116 | +interface Comparable<T> { |
| 117 | + fn compare(T other) : int; |
| 118 | +}; |
| 119 | +``` |
| 120 | + |
| 121 | +#### 带约束的泛型 |
| 122 | +```codenothing |
| 123 | +fn sort<T: Comparable<T>>(array<T> items) : array<T> where T: Copy { |
| 124 | + // 排序实现 |
| 125 | + return items; |
| 126 | +}; |
| 127 | +``` |
| 128 | + |
| 129 | +### 3. 解析器实现 |
| 130 | + |
| 131 | +#### 泛型解析器 (generic_parser.rs) |
| 132 | +- `parse_generic_parameters()` - 解析泛型参数列表 `<T, U, K>` |
| 133 | +- `parse_generic_parameter()` - 解析单个泛型参数 |
| 134 | +- `parse_type_constraints()` - 解析类型约束 |
| 135 | +- `parse_where_clause()` - 解析 where 子句 |
| 136 | +- `parse_generic_type_arguments()` - 解析泛型类型实例化 |
| 137 | +- `parse_generic_function_call()` - 解析泛型函数调用 |
| 138 | +- `parse_generic_object_creation()` - 解析泛型对象创建 |
| 139 | + |
| 140 | +#### 集成到现有解析器 |
| 141 | +- 函数解析器支持泛型参数和 where 子句 |
| 142 | +- 类解析器支持泛型类和泛型方法 |
| 143 | +- 枚举解析器支持泛型枚举 |
| 144 | +- 接口解析器支持泛型接口 |
| 145 | +- 表达式解析器支持泛型函数调用和对象创建 |
| 146 | + |
| 147 | +### 4. 类型系统扩展 |
| 148 | + |
| 149 | +#### 类型推断 |
| 150 | +- 支持 `name: auto = value` 变量声明的类型推断 |
| 151 | +- 使用 `Type::Auto` 进行自动类型推断 |
| 152 | + |
| 153 | +#### 类型检查 |
| 154 | +- 泛型类型参数的验证 |
| 155 | +- 类型约束的检查 |
| 156 | +- where 子句的验证 |
| 157 | + |
| 158 | +### 5. 运行时支持 |
| 159 | + |
| 160 | +#### 表达式求值器扩展 |
| 161 | +- `GenericFunctionCall` - 泛型函数调用求值 |
| 162 | +- `GenericMethodCall` - 泛型方法调用求值 |
| 163 | +- `GenericObjectCreation` - 泛型对象创建求值 |
| 164 | +- `TypeCast` - 类型转换求值 |
| 165 | +- `TypeOf` - 类型查询求值 |
| 166 | + |
| 167 | +## 使用示例 |
| 168 | + |
| 169 | +### 基本泛型函数 |
| 170 | +```codenothing |
| 171 | +fn identity<T>(value: T) : T { |
| 172 | + return value; |
| 173 | +}; |
| 174 | +
|
| 175 | +fn main() : void { |
| 176 | + int_result: auto = identity<int>(42); |
| 177 | + string_result: auto = identity<string>("Hello"); |
| 178 | +}; |
| 179 | +``` |
| 180 | + |
| 181 | +### 泛型类使用 |
| 182 | +```codenothing |
| 183 | +fn main() : void { |
| 184 | + int_container: auto = new Container<int>(42); |
| 185 | + string_container: auto = new Container<string>("Hello"); |
| 186 | +
|
| 187 | + value: auto = int_container.get<int>(); |
| 188 | + int_container.set<int>(100); |
| 189 | +}; |
| 190 | +``` |
| 191 | + |
| 192 | +### 类型转换和查询 |
| 193 | +```codenothing |
| 194 | +fn main() : void { |
| 195 | + x: auto = 42; |
| 196 | + y: auto = x as float; |
| 197 | + type_info: auto = typeof(x); |
| 198 | +}; |
| 199 | +``` |
| 200 | + |
| 201 | +## 当前限制 |
| 202 | + |
| 203 | +1. **类型擦除**: 当前实现在运行时忽略类型参数,主要用于编译时检查 |
| 204 | +2. **约束检查**: 类型约束的运行时检查尚未完全实现 |
| 205 | +3. **类型推断**: 复杂的类型推断场景可能不完全支持 |
| 206 | +4. **性能优化**: 泛型代码的性能优化尚未实现 |
| 207 | + |
| 208 | +## 未来改进 |
| 209 | + |
| 210 | +1. **完整的类型检查**: 实现完整的泛型类型检查和约束验证 |
| 211 | +2. **类型推断增强**: 改进类型推断算法 |
| 212 | +3. **运行时类型信息**: 添加运行时类型信息支持 |
| 213 | +4. **性能优化**: 实现泛型代码的单态化优化 |
| 214 | +5. **更多约束类型**: 添加更多内置约束类型 |
| 215 | +6. **高阶类型**: 支持高阶类型和类型构造器 |
| 216 | + |
0 commit comments