| 
 | 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