calc23 — 多行输入、进制输出、错误恢复、常量折叠、配置加载等
1. 概述
本次迭代完成了 features.md 中 I1~I7 共 7 项建议,涵盖 REPL 体验增强、错误恢复、测试覆盖、性能优化和配置管理。
完成项:
| I1 | REPL 行编辑(!! 重复命令) | 用户体验 |
| I2 | 多行输入支持(括号未闭合时续行) | 用户体验 |
| I3 | 进制输出命令(hex/oct/bin/dec) | 新功能 |
| I4 | 错误恢复(分号分隔表达式错误后继续) | 健壮性 |
| I5 | 测试 ; 分隔符功能 | 测试覆盖 |
| I6 | 常量折叠(表达式结果缓存) | 性能优化 |
| I7 | 配置文件支持(~/.calcrc) | 配置管理 |
2. 变更清单
| main.c | 编辑 | 多行输入、!! 命令、进制输出、配置文件、常量折叠缓存 |
| eval.c | 编辑 | eval_exprs 错误恢复:错误后跳过到 ; 继续 |
| test_semicolon.sh | 新建 | 7 个分号分隔符测试用例 |
3. I1 — REPL 行编辑
新增 !! 命令重复执行最后一条历史记录:
calc> 3+5*2
5 * 2 = 10
3 + 10 = 13
result: 13
calc> !!
>> 3+5*2
5 * 2 = 10
3 + 10 = 13
result: 13
4. I2 — 多行输入
当括号未闭合时,自动显示 …> 续行提示:
calc> (3 + 5
…> ) * 2
3 + 5 = 8
8 * 2 = 16
result: 16
实现:unclosed_brackets() 函数检测括号平衡,REPL 循环中自动续行。
5. I3 — 进制输出命令
新增 hex、oct、bin、dec 命令切换输出进制:
calc> dec
output base: dec
calc> 255
255
calc> hex
output base: hex
calc> 255
0xFF
print_value() 函数处理各种进制输出格式。
6. I4 — 错误恢复
eval_exprs 中错误后自动跳过到下一个 ;,继续执行后续表达式:
calc> 1/0; 3+5
error: division by zero
3 + 5 = 8
result: 8
7. I5 — 测试分隔符
新建 test_semicolon.sh 测试脚本,7 个测试用例覆盖分号分隔符功能:
$ sh test_semicolon.sh
PASS: '1;2;3' → 3
PASS: 'a=5;b=6;a+b' → 11
...
=== 完成 ===
8. I6 — 常量折叠
实现 16 条目的表达式结果缓存。相同表达式重复求值时直接返回缓存值,避免重复解析和计算:
#define CACHE_SIZE 16
typedef struct { char expr[64]; long double val; } CacheEntry;
static CacheEntry expr_cache[CACHE_SIZE];
9. I7 — 配置文件支持
启动时自动加载 ~/.calcrc 文件,支持变量预设和以 # 开头的注释:
# .calcrc — calc 配置文件
PI = 3.141592653589793
E = 2.718281828459045
10. 测试验证
$ make test
============================================
calc — 测试套件
============================================
124 passed, 0 failed, 124 total
============================================
$ sh test_semicolon.sh
PASS: '1;2;3' → 3
...
=== 完成 ===
网硕互联帮助中心





评论前必须登录!
注册