Skip to content
Merged
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
111 changes: 111 additions & 0 deletions devel/0069.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
# [0069] 迁移更多 s7 内置 list 相关函数从 s7.c 到 s7_liii_list.c

## 1. 相关文档
- [dddd.md](dddd.md) - 任务文档模板

## 2. 任务相关的代码文件
- `src/s7.c` — 主解释器(list 函数原始实现)
- `src/s7_liii_list.c` / `src/s7_liii_list.h` — 目标迁移文件
- `src/s7_internal_helpers.h` — 内部辅助函数桥接声明

## 3. 如何测试

### 3.1 确定性测试(单元测试)
```bash
xmake b goldfish
bin/gf tests/s7/pair-test.scm
bin/gf tests/s7/list-test.scm
```

### 3.2 提交前执行
```bash
bin/gf test --changed-since=main
```

## 4. 如何提交

```bash
git push -u origin da/0069/s7_list
```

## 5. 待迁移函数清单

### 第一批:简单谓词函数
| 函数名 | s7.c 行号 | 说明 |
|---|---|---|
| `g_is_pair` | 29607-29612 | pair? 谓词 |
| `g_is_list` | 29620-29626 | list? 谓词 |
| `g_is_proper_list` | 29702-29707 | proper-list? 谓词 |

依赖:`check_boolean_method` 宏(需要桥接为 `s7i_check_boolean_method` 或手动展开)

### 第二批:3 级 cxxxr 变体
| 函数名 | s7.c 行号 | 说明 |
|---|---|---|
| `g_caaar` | 30134-30139 | car(car(car(x))) |
| `g_caadr` | 30151-30160 | car(car(cdr(x))) |
| `g_cadar` | 30163-30173 | car(cdr(car(x))) |
| `g_caddr` | 30201-30211 | car(cdr(cdr(x))) |
| `g_cdaar` | 30193-30198 | cdr(car(car(x))) |
| `g_cdddr` | 30241-30246 | cdr(cdr(cdr(x))) |
| `g_cdadr` | 30257-30262 | cdr(car(cdr(x))) |
| `g_cddar` | 30273-30278 | cdr(cdr(car(x))) |

依赖:`sole_arg_method_or_bust`(已有桥接 `s7i_sole_arg_method_or_bust`)、`sole_arg_wrong_type_error_nr`(需要新增桥接)、各种 `*_a_list_string` 错误字符串(需要 extern 暴露)

### 第三批:4 级 cxxxr 变体
| 函数名 | s7.c 行号 | 说明 |
|---|---|---|
| `g_caaaar` | 30281-30292 | car^4(x) |
| `g_caaadr` | 30295-30306 | car^3(cdr(x)) |
| `g_caadar` | 30309-30320 | car^2(cdr(car(x))) |
| `g_cadaar` | 30323-30334 | car^2(cdr(car^2(x))) |
| `g_caaddr` | 30347-30352 | car^2(cdr^2(x)) |
| `g_cadddr` | 30364-30369 | car(cdr^3(x)) |
| `g_cadadr` | 30381-30386 | car(cdr(car(cdr(x)))) |
| `g_caddar` | 30398-30403 | car(cdr^2(car(x))) |
| `g_cdaaar` | 30406-30417 | cdr(car^3(x)) |
| `g_cdaadr` | 30420-30431 | cdr(car^2(cdr(x))) |
| `g_cdadar` | 30434-30445 | cdr(car(cdr(car(x)))) |
| `g_cddaar` | 30448-30459 | cdr^2(car^2(x)) |
| `g_cdaddr` | 30462-30473 | cdr(car(cdr^2(x))) |
| `g_cddddr` | 30486-30491 | cdr^4(x) |
| `g_cddadr` | 30503-30508 | cdr^2(car(cdr(x))) |
| `g_cdddar` | 30521-30526 | cdr^3(car(x)) |

依赖:同第二批

### 第四批:assoc/assq/assv 函数
| 函数名 | s7.c 行号 | 说明 |
|---|---|---|
| `g_assq` | 30555-30563 | assoc via eq? |
| `g_assv` | 30596-30601 | assoc via eqv? |
| `g_assoc` | 30688-30787 | assoc via equal? |

依赖:`s7_assq`(已有公共 API)、`assv_p_pp`、`assoc_1`、`method_or_bust_pp`(已有桥接)、`method_or_bust_ppp`(需桥接)、`methods_or_bust_pp`(需桥接)、`closure_has_two_normal_args`、`is_safe_c_function`/`c_function_call` 等优化器内部函数

### 第五批:其他 list 函数
| 函数名 | s7.c 行号 | 说明 |
|---|---|---|
| `g_make_list` | 29764-29769 | make-list |
| `g_length` | 40537-40544 | length |
| `g_reverse` | 41627-41633 | reverse |
| `g_reverse_in_place` | 41854-41860 | reverse! |
| `g_list_append` | 31408-31495 | append |
| `g_vector_to_list` | 32418-32448 | vector->list |

## 6. 日期 任务描述

### 2025-05-29 第二、三批:3 级和 4 级 cxxxr 变体迁移

#### What
1. 迁移 8 个 3 级 cxxxr g_ 函数(caaar, caadr, cadar, caddr, cdaar, cdddr, cdadr, cddar)到 s7_liii_list.c
2. 迁移 16 个 4 级 cxxxr g_ 函数(caaaar, caaadr, caadar, cadaar, caaddr, cadddr, cadadr, caddar, cdaaar, cdaadr, cdadar, cddaar, cdaddr, cddddr, cddadr, cdddar)到 s7_liii_list.c
3. 所有 _p_p 优化函数保留在 s7.c 中
4. 使用公共 API(s7_wrong_type_arg_error, s7i_sole_arg_method_or_bust)重写,无需新增桥接

#### Why
继续分批迁移 s7 内置 list 相关函数,减小 s7.c 的体积。

#### How
迁移模式与第一批一致:g_ 函数使用公共 API 重写迁移到 s7_liii_list.c,_p_p 优化函数因依赖 s7.c 内部 static 变量和宏而保留。第四批(assoc/assq/assv)和第五批(g_length, g_reverse_in_place, g_list_append, g_vector_to_list)因大量依赖内部 static 函数而暂不迁移。
Loading
Loading