Updated closures

This commit is contained in:
2026-06-05 12:14:19 +02:00
parent 8df4351563
commit 0955bca5bc
4 changed files with 46 additions and 32 deletions
+27 -18
View File
@@ -101,6 +101,32 @@ impl GenRust for Expression {
cg.add(op); cg.add(op);
rhs.gen_rust(ctx, cg); rhs.gen_rust(ctx, cg);
} }
Expression::Closure {
return_type,
params,
body,
} => {
cg.add("|");
for (i, arg) in params.iter().enumerate() {
if i > 0 {
cg.add(", ");
}
arg.gen_rust(ctx, cg);
}
cg.add("| ");
if let Some(ty) = return_type {
cg.add("-> ");
cg.add(&ty.get_rust());
cg.add(" ");
cg.ensure_brackets_expr(ctx, body);
} else {
body.gen_rust(ctx, cg);
}
}
} }
if ensure_semicolon { if ensure_semicolon {
@@ -114,30 +140,13 @@ impl GenRust for Expression {
} }
impl GenRust for Prefix { impl GenRust for Prefix {
fn gen_rust(&self, ctx: &mut Context, cg: &mut RustCodegen) { fn gen_rust(&self, _ctx: &mut Context, cg: &mut RustCodegen) {
match self { match self {
Self::Deref => cg.add("*"), Self::Deref => cg.add("*"),
Self::Ref => cg.add("&"), Self::Ref => cg.add("&"),
Self::RefMut => cg.add("&mut "), Self::RefMut => cg.add("&mut "),
Self::Not => cg.add("!"), Self::Not => cg.add("!"),
Self::Neg => cg.add("-"), Self::Neg => cg.add("-"),
Self::Closure(ty, args) => {
cg.add("|");
for (i, arg) in args.iter().enumerate() {
if i > 0 {
cg.add(", ");
}
arg.gen_rust(ctx, cg);
}
cg.add("| ");
if let Some(ty) = ty {
cg.add("-> ");
cg.add(&ty.get_rust());
cg.add(" ");
}
}
} }
} }
} }
+5 -1
View File
@@ -7,6 +7,11 @@ pub enum Expression {
Literal(Literal), Literal(Literal),
Path(ExprPath), Path(ExprPath),
Statement(Box<Statement>), Statement(Box<Statement>),
Closure {
return_type: Option<TypeExpr>,
params: Vec<VarDecl>,
body: Box<Expression>,
},
Fix { Fix {
initial: Box<Expression>, initial: Box<Expression>,
prefixes: Vec<Prefix>, prefixes: Vec<Prefix>,
@@ -72,7 +77,6 @@ pub enum Prefix {
Deref, Deref,
Not, Not,
Neg, Neg,
Closure(Option<TypeExpr>, Vec<VarDecl>),
} }
#[derive(Debug, Clone, Serialize)] #[derive(Debug, Clone, Serialize)]
+4 -3
View File
@@ -30,6 +30,7 @@ keyword = {
| "false" | "false"
| "dyn" | "dyn"
| "loop" | "loop"
| "fn"
} }
identifier = @{ identifier = @{
@@ -448,7 +449,7 @@ match_stmt = {
// CLOSURES // CLOSURES
// ------------------------------------------------------ // ------------------------------------------------------
closure = { type_expr? ~ "|" ~ param_list ~ "|" } closure = { type_expr? ~ "fn" ~ "(" ~ param_list ~ ")" ~ expr }
// ------------------------------------------------------ // ------------------------------------------------------
// TUPLES & ARRAYS // TUPLES & ARRAYS
@@ -490,6 +491,7 @@ expr_path = {
primary = { primary = {
control_flow control_flow
| closure
| basic_stmt | basic_stmt
| literal | literal
| expr_path | expr_path
@@ -571,8 +573,7 @@ not_px = { "!" }
neg_px = { "-" } neg_px = { "-" }
prefix = { prefix = {
closure deref_px
| deref_px
| mut_ref_px | mut_ref_px
| ref_px | ref_px
| not_px | not_px
+10 -10
View File
@@ -75,6 +75,16 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Expression {
)) ))
} }
Rule::closure => {
ast_expr!(Self::Closure {
return_type: consume_rule(&mut inner, Rule::type_expr)
.map(TypeExpr::try_from)
.transpose(),
params: collect_recovered(inner.next().unwrap().into_inner()),
body: Expression::try_from(inner.next().unwrap()).map(Box::new),
})
}
Rule::primary => pair.into_inner().next().unwrap().try_into(), Rule::primary => pair.into_inner().next().unwrap().try_into(),
Rule::static_path => ast_expr!(Expression::Path(pair.try_into())), Rule::static_path => ast_expr!(Expression::Path(pair.try_into())),
Rule::literal => ast_expr!(Expression::Literal(pair.try_into())), Rule::literal => ast_expr!(Expression::Literal(pair.try_into())),
@@ -108,16 +118,6 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Prefix {
Rule::ref_px => Self::Ref, Rule::ref_px => Self::Ref,
Rule::not_px => Self::Not, Rule::not_px => Self::Not,
Rule::neg_px => Self::Neg, Rule::neg_px => Self::Neg,
Rule::closure => {
let mut inner = pair.into_inner();
return ast_expr!(Self::Closure(
consume_rule(&mut inner, Rule::type_expr)
.map(TypeExpr::try_from)
.transpose(),
collect_recovered(inner.next().unwrap().into_inner())
));
}
_ => return AstError::bug_unimplemented(pair), _ => return AstError::bug_unimplemented(pair),
}) })