AI开发C语言应用按步走,表达式计算器calc的第二十三步,多行输入、进制输出、错误恢复、常量折叠、配置加载等

calc23 — 多行输入、进制输出、错误恢复、常量折叠、配置加载等

1. 概述

本次迭代完成了 features.md 中 I1~I7 共 7 项建议,涵盖 REPL 体验增强、错误恢复、测试覆盖、性能优化和配置管理。

完成项

编号功能类型
I1REPL 行编辑(!! 重复命令)用户体验
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 — 进制输出命令

新增 hexoctbindec 命令切换输出进制:

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
...
=== 完成 ===
「LLM那些事」系列第 4 篇《上下文窗口的边界》,文章连接:https://blog.csdn.net/houwenjin/article/details/163999753。 演示什么:在「预测」Sheet 的黄色格子里输入一句话(默认「来泡一杯」),四个「模型」——分别只统计最后 1 / 2 / 3 / 4 个字的 n-gram 查表——同时预测下一个字。同一个输入,看的上下文越长,候选越少、预测越确定: ┌────────────────┬──────────┬───────────────┬──────┐ │ 只看最后几个字 │ 用的前缀 │ 候选下一字数 │ 预测 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 1 个 │ 杯 │ 3(茶/子/水) │ 模糊 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 2 个 │ 一杯 │ 2(茶/水) │ 收窄 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 3 个 │ 泡一杯 │ 1(茶) │ 确定 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 4 个 │ 来泡一杯 │ 1(茶) │ 确定 │ └────────────────┴──────────┴───────────────┴──────┘
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 笔记本的散热风扇管理 ---------------------------------------- 09 November 2006. 对于版本20061109的变更概述如下: 1) ACPI CA核心子系统:在源操作数是一个操作区域的场景下,对负载ASL操作符进行了优化。仅需映射操作区域内存,而不是执行逐字节读取。 (区域必须为SystemMemory类型,见下文。)修正了源操作数为区域字段的负载ASL操作符问题。也允许缓冲区对象作为源操作数。 BZ 480 解决了负载ASL操作符允许源操作数为任意类型操作区域的问题。现被限制为仅SystemMemory类型的区域,符合ACPI规范。 BZ 481 对新表管理器代码进行了额外的清理和优化。AcpiEnable将在所有必需的ACPI表未加载时失败(FADT, FACS, DSDT)。 BZ 477 在acobject.h中添加了#pragma pack(8/4),以确保此头文件中的结构始终编译为对齐。ACPI_OPERAND_OBJECT已被手动优化为对齐,并在字节打包时无法工作。示例代码和数据大小:这些是Microsoft Visual C++ 6.0 32位编译器生成的、与操作系统无关的acpica.lib的大小。调试版本的代码包含调试输出跟踪机制,具有更大的代码和数据大小。上一个版本:非调试版本:78.1K代码,17.1K数据,95.2K总计 调试版本:155.4K代码,63.1K数据,218.5K总计 当前版本:非调试版本:77.9K代码,17.0K数据,94.9K总计 调试版本:155.2K代码,63.1K数据,...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值