Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 63 additions & 0 deletions devel/0076.md
Original file line number Diff line number Diff line change
@@ -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 函数实现的模块。
1 change: 0 additions & 1 deletion src/s7.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
Loading