diff --git a/devel/0076.md b/devel/0076.md new file mode 100644 index 00000000..5d06de15 --- /dev/null +++ b/devel/0076.md @@ -0,0 +1,63 @@ +# [0076] 将 s7.c 中的算术运算代码拆分到 s7_scheme_number.c + +## 1. 相关文档 +- [dddd.md](dddd.md) - 任务文档模板 +- [0072.md](0072.md) - 从 s7.c 拆分基础函数和谓词函数 +- [0074.md](0074.md) - 完善 call/cc 支持:测试与底层代码拆分 + +## 2. 任务相关的代码文件 +- `src/s7.c` - 被拆分的原始文件 +- `src/s7_scheme_number.c` / `src/s7_scheme_number.h` - 拆分后的目标文件(已回退) +- `xmake.lua` +- `tests/scheme/s7-test.scm` + +## 3. 如何测试 + +### 3.1 编译测试 +```bash +xmake b goldfish +``` + +### 3.2 全量回归测试 +```bash +bin/gf test +``` + +## 4. 如何提交 + +提交前执行以下最少步骤: + +```bash +bin/gf test --changed-since=main +``` + +## 5. 2026-06-01 尝试拆分 s7.c 算术运算代码(已回退) + +### 5.1 What + +曾尝试将 `s7.c` 中从 `/* ---------------------------------------- add ---------------------------------------- */` 到 `g_add_i_random` 结束之间的算术运算通用版本代码(约 3500 行)拆分至 `src/s7_scheme_number.c`。 + +### 5.2 Why(回退原因) + +**拆分方式错误**。采用了与 `s7_continuation.c` 相同的条件包含模式(在 `.h` 中 `#include ".c"`),但这种方式下 `.c` 文件不是独立编译单元——代码仍内联到 `s7.c` 中编译,无法真正降低编译时间,也不符合项目已有独立编译单元(`s7_scheme_base.c`、`s7_scheme_predicate.c` 等)的规范。 + +**更深层的障碍**:算术运算通用版本(`g_add`、`g_subtract`、`g_multiply`、`g_divide`、`g_num_eq`、`g_less`、`g_greater` 等)深度依赖 `s7.c` 的内部宏: +- 列表操作:`car`、`cdr`、`is_null`、`is_pair` +- 类型检查与访问:`type()`、`is_t_integer()`、`is_t_real()`、`integer()`、`real()`、`fraction()`、`real_part()`、`imag_part()`、`denominator()`、`numerator()`、`T_RATIO`、`T_COMPLEX` +- 数值创建:`make_ratio()`、`make_complex_not_0i()`、`make_integer_unchecked()`、`int_zero`、`int_one` +- 错误处理:`method_or_bust_p()`、`sc->error_argnum`、`wrong_type_error_nr()` + +这些内部宏依赖 `s7_cell` 结构体的内部布局,而 `s7_cell` 的完整定义仅在 `s7.c` 中,未暴露给独立编译单元。若要改为真正的独立编译单元,需要: +- 暴露 `s7_cell` 定义到公共/内部头文件中(破坏封装),或 +- 创建数十个 bridge 函数并改写 3500 行代码中的每一处宏调用(工作量巨大、风险高、可能引入性能回退) + +### 5.3 How + +回退操作: +1. 将 `src/s7_scheme_number.c` 中的代码重新合并回 `src/s7.c` +2. 删除 `src/s7_scheme_number.h` 和 `src/s7_scheme_number.c` +3. 恢复 `src/s7.c` 到原始状态 + +### 5.4 结论 + +本次尝试确认:**深度依赖 `s7.c` 内部类型宏的算术运算核心代码,目前不适合拆分为独立编译单元**。后续如需继续拆分 `s7.c`,应优先选择边界清晰、可使用公共 API(`s7_car`、`s7_cdr`、`s7_is_pair`、`s7_make_real` 等)或已有 bridge 函数实现的模块。 diff --git a/src/s7.c b/src/s7.c index ec13736d..685bf4af 100644 --- a/src/s7.c +++ b/src/s7.c @@ -13974,7 +13974,6 @@ static s7_pointer log_chooser(s7_scheme *sc, s7_pointer func, int32_t args, s7_p - /* ---------------------------------------- add ---------------------------------------- */ static inline s7_pointer add_if_overflow_to_real_or_big_integer(s7_scheme *sc, s7_int x, s7_int y) {