Skip to content
This repository was archived by the owner on Aug 18, 2025. It is now read-only.

Commit 48932e6

Browse files
committed
新增DEFAULT_PARAMS_RAW_STRINGS_CHANGELOG_v0.4.6.md文件,详细记录默认参数值与原始字符串字面量功能的重大更新,包括语法规则、主要特性、技术实现及未来扩展计划,提升文档可读性与开发者理解。
1 parent a8573d7 commit 48932e6

File tree

1 file changed

+154
-0
lines changed

1 file changed

+154
-0
lines changed
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
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

Comments
 (0)