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>
This commit is contained in:
@@ -32,6 +32,7 @@ typedef enum {
|
||||
AST_ARRAY_ASSIGN_STMT,// arr[i] = expr
|
||||
AST_IMPL_BLOCK, // impl StructName { fn method(...) ... }
|
||||
AST_METHOD_CALL, // receiver.method(args)
|
||||
AST_LAMBDA, // fn(x: T) -> R { body } 匿名函数/闭包
|
||||
AST_MOD_DECL, // mod foo;
|
||||
AST_USE_DECL, // use foo::bar;
|
||||
AST_TRAIT_DECL, // trait Name { fn ... }
|
||||
@@ -131,6 +132,12 @@ struct AstNode {
|
||||
struct { const char* struct_name; struct AstNode** methods; size_t method_count; } impl_block;
|
||||
// AST_METHOD_CALL
|
||||
struct { struct AstNode* receiver; const char* method_name; struct AstNode** args; const char** arg_names; size_t arg_count; } method_call;
|
||||
// AST_LAMBDA
|
||||
struct { struct AstNode** params; size_t param_count;
|
||||
TypeKind return_type; const char* return_struct_type_name;
|
||||
struct AstNode* body;
|
||||
const char* generated_name; // 自动生成的顶层函数名
|
||||
const char** captured; size_t captured_count; } lambda;
|
||||
// AST_MOD_DECL
|
||||
struct { const char* name; struct AstNode* ast; } mod_decl;
|
||||
// AST_USE_DECL
|
||||
@@ -185,6 +192,9 @@ AstNode* ast_make_index_expr(void* alloc, AstNode* array, AstNode* index, Source
|
||||
AstNode* ast_make_array_assign(void* alloc, const char* name, AstNode* index, AstNode* value, SourceLoc loc);
|
||||
AstNode* ast_make_impl_block(void* alloc, const char* struct_name, AstNode** methods, size_t count, SourceLoc loc);
|
||||
AstNode* ast_make_method_call(void* alloc, AstNode* receiver, const char* method, AstNode** args, const char** arg_names, size_t count, SourceLoc loc);
|
||||
AstNode* ast_make_lambda(void* alloc, AstNode** params, size_t pcount,
|
||||
TypeKind ret, const char* ret_struct_name,
|
||||
AstNode* body, SourceLoc loc);
|
||||
AstNode* ast_make_mod_decl(void* alloc, const char* name, AstNode* sub_ast, SourceLoc loc);
|
||||
AstNode* ast_make_use_decl(void* alloc, const char* path, const char* item, SourceLoc loc);
|
||||
AstNode* ast_make_trait_decl(void* alloc, const char* name, AstNode** methods, size_t count, SourceLoc loc);
|
||||
|
||||
Reference in New Issue
Block a user