conlang: Single-expression functions

This commit is contained in:
John 2025-02-20 21:59:42 -06:00
parent 3b14186b70
commit 772286eefa
7 changed files with 18 additions and 8 deletions

View File

@ -146,7 +146,7 @@ pub struct Function {
pub name: Sym,
pub sign: TyFn,
pub bind: Vec<Param>,
pub body: Option<Block>,
pub body: Option<Expr>,
}
/// A single parameter for a [Function]

View File

@ -107,7 +107,7 @@ pub trait Fold {
name: self.fold_sym(name),
sign: self.fold_ty_fn(sign),
bind: bind.into_iter().map(|p| self.fold_param(p)).collect(),
body: body.map(|b| self.fold_block(b)),
body: body.map(|b| self.fold_expr(b)),
}
}
fn fold_param(&mut self, p: Param) -> Param {

View File

@ -85,7 +85,7 @@ pub trait Visit<'a>: Sized {
self.visit_ty_fn(sign);
bind.iter().for_each(|p| self.visit_param(p));
if let Some(b) = body {
self.visit_block(b)
self.visit_expr(b)
}
}
fn visit_param(&mut self, p: &'a Param) {

View File

@ -71,7 +71,7 @@ impl<'a> Visit<'a> for CollectUpvars<'_> {
self.bind_name(name);
}
if let Some(body) = body {
self.visit_block(body);
self.visit_expr(body);
}
}

View File

@ -459,12 +459,11 @@ impl Parse<'_> for Function {
sign,
bind,
body: match p.peek_kind(P)? {
TokenKind::LCurly => Some(Block::parse(p)?),
TokenKind::Semi => {
p.consume_peeked();
None
}
t => Err(p.error(Unexpected(t), P))?,
_ => Some(Expr::parse(p)?),
},
})
}

View File

@ -108,7 +108,7 @@ impl<'a> Visit<'a> for Populator<'_, 'a> {
self.visit_ty_fn(sign);
bind.iter().for_each(|p| self.visit_param(p));
if let Some(b) = body {
self.visit_block(b)
self.visit_expr(b)
}
}

View File

@ -26,7 +26,7 @@ Static = "static" Mutability Identifier ':' Ty '=' Expr ';' ;
Module = "mod" Identifier ModuleKind ;
ModuleKind = '{' Item* '}' | ';' ;
Function = "fn" Identifier '(' (Param ',')* Param? ')' ('->' Ty)? Block? ;
Function = "fn" Identifier '(' (Param ',')* Param? ')' ('->' Ty)? (Expr | ';') ;
Param = Mutability Identifier ':' Ty ;
Struct = "struct" Identifier (StructTuple | StructBody)?;
@ -127,6 +127,17 @@ Block = '{' Stmt* '}';
Group = Empty | '(' (Expr | Tuple) ')' ;
Tuple = (Expr ',')* Expr? ;
Match = "match" { (MatchArm ',')* MatchArm? } ;
MatchArm = Pattern '=>' Expr ;
Pattern = Path
| Literal
| '&' "mut"? Pattern
| '(' (Pattern ',')* (Pattern | '..' )? ')'
| '[' (Pattern ',')* (Pattern | '..' Identifier?)? ']'
| StructPattern
;
Loop = "loop" Block ;
While = "while" Expr Block Else ;
If = "if" Expr Block Else ;