|
| 1 | +# CodeNothing 默认参数值与原始字符串字面量功能 - v0.4.6(2025-07-26) |
| 2 | + |
| 3 | +## 🚀 重大新功能 |
| 4 | + |
| 5 | +### 1. 默认参数值 (Default Parameter Values) |
| 6 | + |
| 7 | +默认参数值允许函数定义中的参数指定一个默认值,当调用函数时没有提供该参数时,将使用该默认值。这极大地提高了函数定义的灵活性和使用便利性。 |
| 8 | + |
| 9 | +#### 语法规则 |
| 10 | + |
| 11 | +```cn |
| 12 | +fn 函数名(参数名 : 参数类型 = 默认值, ...) : 返回类型 { |
| 13 | + // 函数体 |
| 14 | +} |
| 15 | +``` |
| 16 | + |
| 17 | +#### 主要特性 |
| 18 | + |
| 19 | +- **参数可选性**:可以使函数参数变为可选参数,简化函数调用 |
| 20 | +- **表达式支持**:默认值可以是常量、变量或复杂表达式 |
| 21 | +- **提高可读性**:使API更加清晰,减少样板代码 |
| 22 | +- **与必需参数混合**:可以和必需参数一起使用 |
| 23 | + |
| 24 | +#### 示例 |
| 25 | + |
| 26 | +```cn |
| 27 | +// 简单默认参数 |
| 28 | +fn greet(name : string = "世界", greeting : string = "你好") : string { |
| 29 | + return `${greeting},${name}!`; |
| 30 | +}; |
| 31 | +
|
| 32 | +// 使用默认值调用 |
| 33 | +greet(); // 结果: "你好,世界!" |
| 34 | +greet("张三"); // 结果: "你好,张三!" |
| 35 | +greet("李四", "您好"); // 结果: "您好,李四!" |
| 36 | +
|
| 37 | +// 表达式作为默认值 |
| 38 | +fn multiply(a : int, b : int = a * 2) : int { |
| 39 | + return a * b; |
| 40 | +}; |
| 41 | +
|
| 42 | +multiply(5); // 结果: 50,使用 5 * (5*2) |
| 43 | +multiply(3, 4); // 结果: 12,使用提供的值 |
| 44 | +``` |
| 45 | + |
| 46 | +### 2. 原始字符串字面量 (Raw String Literals) |
| 47 | + |
| 48 | +原始字符串字面量允许定义一个不处理转义序列的字符串,使特殊字符如反斜杠(`\`)和引号保持字面值。这在处理正则表达式、文件路径等需要大量转义字符的场景下特别有用。 |
| 49 | + |
| 50 | +#### 语法规则 |
| 51 | + |
| 52 | +```cn |
| 53 | +r"原始字符串内容" |
| 54 | +``` |
| 55 | + |
| 56 | +#### 主要特性 |
| 57 | + |
| 58 | +- **无需转义**:字符串中的`\`和其他特殊字符不再需要额外转义 |
| 59 | +- **简化复杂字符串**:特别适合正则表达式、文件路径等 |
| 60 | +- **保留字符原义**:例如`\n`、`\t`等序列在原始字符串中保持字面值 |
| 61 | +- **提高可读性**:减少代码中的转义字符,使代码更加清晰 |
| 62 | + |
| 63 | +#### 示例 |
| 64 | + |
| 65 | +```cn |
| 66 | +// 常规字符串(需要转义) |
| 67 | +path1 : string = "C:\\Users\\Documents\\file.txt"; |
| 68 | +
|
| 69 | +// 原始字符串(无需转义) |
| 70 | +path2 : string = r"C:\Users\Documents\file.txt"; |
| 71 | +
|
| 72 | +// 特殊字符比较 |
| 73 | +normal : string = "第一行\n第二行\t缩进"; // 特殊字符会被转义 |
| 74 | +raw : string = r"第一行\n第二行\t缩进"; // 特殊字符保持原样 |
| 75 | +
|
| 76 | +// 正则表达式(无需双重转义) |
| 77 | +regex : string = r"\d+\.\d+"; |
| 78 | +``` |
| 79 | + |
| 80 | +## 🔧 技术实现 |
| 81 | + |
| 82 | +### 默认参数值实现 |
| 83 | + |
| 84 | +1. **AST扩展**: |
| 85 | + - `Parameter` 结构体增加 `default_value: Option<Expression>` 字段 |
| 86 | + |
| 87 | +2. **函数解析器增强**: |
| 88 | + - 检测参数声明后的 `=` 符号 |
| 89 | + - 解析默认值表达式 |
| 90 | + - 将默认值存储在参数结构中 |
| 91 | + |
| 92 | +3. **函数调用处理**: |
| 93 | + - 在调用函数时检查提供的参数数量 |
| 94 | + - 如果缺少参数且有默认值,则计算默认值 |
| 95 | + - 将计算结果用于函数执行 |
| 96 | + |
| 97 | +### 原始字符串字面量实现 |
| 98 | + |
| 99 | +1. **AST扩展**: |
| 100 | + - 新增 `RawStringLiteral(String)` 表达式类型 |
| 101 | + |
| 102 | +2. **词法分析器增强**: |
| 103 | + - 识别 `r"..."` 格式的字符串 |
| 104 | + - 将其解析为特殊的 token 类型 |
| 105 | + |
| 106 | +3. **解析器增强**: |
| 107 | + - 识别原始字符串标记 |
| 108 | + - 将内容解析为 `RawStringLiteral` 表达式 |
| 109 | + |
| 110 | +4. **表达式求值器增强**: |
| 111 | + - 添加对 `RawStringLiteral` 的处理逻辑 |
| 112 | + - 在运行时直接使用原始字符串值,无需进一步处理 |
| 113 | + |
| 114 | +## 🔄 兼容性 |
| 115 | + |
| 116 | +- **完全向后兼容**:这两个新功能不影响现有代码 |
| 117 | +- **可选使用**:仅在需要时使用,不强制改变现有编码习惯 |
| 118 | +- **混合使用**:默认参数值可以与普通参数混合使用 |
| 119 | +- **字符串互操作**:原始字符串和常规字符串可以完全互操作 |
| 120 | + |
| 121 | +## 🔮 未来扩展计划 |
| 122 | + |
| 123 | +### 默认参数值相关扩展 |
| 124 | + |
| 125 | +1. **命名参数**:支持按名称传递参数,进一步提高API灵活性 |
| 126 | + ```cn |
| 127 | + fn createPerson(name : string, age : int = 25) : void { ... } |
| 128 | + createPerson(age: 30, name: "张三"); // 按名称传递参数 |
| 129 | + ``` |
| 130 | + |
| 131 | +2. **剩余参数**:支持收集剩余参数为数组 |
| 132 | + ```cn |
| 133 | + fn sum(first : int, ...rest : array<int>) : int { ... } |
| 134 | + ``` |
| 135 | + |
| 136 | +### 原始字符串相关扩展 |
| 137 | + |
| 138 | +1. **多行原始字符串语法**:专门为多行内容优化的语法 |
| 139 | + ```cn |
| 140 | + r""" |
| 141 | + 这是一个多行 |
| 142 | + 原始字符串 |
| 143 | + 保留所有换行和空格 |
| 144 | + """ |
| 145 | + ``` |
| 146 | + |
| 147 | +2. **原始字符串插值**:结合原始字符串和字符串插值的优势 |
| 148 | + ```cn |
| 149 | + r`正则表达式: \d+ 匹配数字 ${number}` |
| 150 | + ``` |
| 151 | + |
| 152 | +--- |
| 153 | + |
| 154 | +这些功能极大地提高了CodeNothing的表达能力,使代码更加简洁、易读,并降低了常见场景下的开发复杂度。特别是与之前实现的字符串插值结合,使字符串处理更加灵活和强大。 |
0 commit comments