Serendipity
|
f5c0650a97
|
feat: 闭包变量捕获 — 环境结构体 + 堆分配
lambda 可捕获外层变量, 自动构建环境结构体:
let base = 100;
let f = fn(x: i64) -> i64 { return x + base; }; // 捕获 base
f(50); // → 150
全流水线实现:
- Sema: collect_free_vars 遍历 AST 收集自由变量
- AST function: captured/cap_types/cap_count 字段存储捕获信息
- Codegen: 闭包类型改为 struct {fn_ptr: i64, env_ptr: ptr}
- Codegen: lambda 表达式 malloc 环境结构体 + 存储捕获值
- Codegen: 生成函数签名添加 env_ptr 首个参数 (capturing only)
- Codegen: 函数体内通过 GEP 注册捕获变量到 var_table
- Codegen: 闭包调用自动提取 fn_ptr/env_ptr, 条件传递 env
非捕获 lambda 兼容: env_ptr=NULL, 不额外传参
嵌套 lambda 正确处理: 内层不穿透捕获外层变量
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-06-07 15:24:35 +08:00 |
|
Serendipity
|
06d80f441a
|
feat: 闭包/lambda — 匿名函数表达式
fn(x: T) -> R { body } 作为表达式, 可赋值给变量并间接调用。
全流水线实现:
- Parser: TOK_FN 前缀 → AST_LAMBDA 节点
- Sema: 自动生成 __lambda_N 顶层函数 + 符号注册
- Sema: analyze_call_expr 支持 TYPE_CLOSURE 变量调用
- Codegen: lambda 表达式返回函数指针(i64), 调用点载入+IntToPtr+间接call
- VarEntry.closure_fn 追踪闭包变量对应的生成函数
限制(MVP v0.1): 非捕获 lambda, 返回类型固定 i64
+6 sema 测试 + 1 集成测试, 209 测试全部通过
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-06-07 15:07:03 +08:00 |
|
Serendipity
|
c8da286d31
|
feat: in/out 参数 — out 关键字引用传递
fn swap(out x: i64, out y: i64) 声明 out 参数,codegen 层面
函数签名变为 T* 指针,调用点自动传 &variable 地址。
in 是默认行为(值传递),无需显式标注。
Token → Parser → Sema → Codegen 全流水线:
- TOK_OUT + "out" 关键字注册
- AST parameter.is_out 字段
- parse_function 解析 out 前缀
- Sema: out 参数注册为 SYM_VARIABLE+is_mut(可赋值)
- Codegen: LLVM 函数签名使用 T*,调用点传 alloca
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-06-07 14:45:38 +08:00 |
|
Serendipity
|
0088347576
|
feat: defer 延迟执行 — defer { stmts; } 在 return 前按 LIFO 执行
Token(73): +TOK_DEFER, AST(28): +AST_DEFER_STMT, 新增 38_defer.l
parser: defer { ... } 块 + defer expr; 表达式两种形式
codegen: defer 栈压入 block, emit_deferred() 在 return 前 LIFO 发射
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-06-07 13:51:10 +08:00 |
|
Serendipity
|
82b0570869
|
refactor: codegen_expr switch→Visitor dispatch (12 handler)
cg_expr.c 440行: 12 表达式handler提取为独立函数 + AstDispatch 表
codegen_expr 从巨型 switch 改为 ast_visit() 查表调用
新增表达式节点: codegen_expr_init() 加一行即可
修复: to_llvm_type/type_info_to_llvm TYPE_ENUM/STR 完整映射
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-06-07 12:59:18 +08:00 |
|
Serendipity
|
6d1db585c4
|
refactor: sema.c + codegen.c 拆分,全部源文件 <800 行
sema.c 1129行 → sema.c 499行 + typeck.c 629行 + sema_internal.h 51行
- typeck.c: 表达式类型检查 (10个analyze_*函数) + 泛型单态化 + 类型关系
- sema.c: analyze_node + sema_analyze
codegen.c 947行 → codegen.c 453行 + cg_expr.c 440行 + codegen_internal.h 83行
- cg_expr.c: LLVM表达式生成 + 类型映射 (to_llvm_type/coerce_int/type_info_to_llvm)
- codegen.c: 语句生成 + 模块入口 + 符号表 + 内存清理
全部核心源文件 <800 行限制: parser(662+498), sema(499+629), codegen(453+440)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-06-06 19:26:54 +08:00 |
|