Add expression functions with context boundaries

This commit is contained in:
pavel 2026-08-27 23:05:49 +02:00
commit 773c34f3f4
18 changed files with 391 additions and 52 deletions

View file

@ -471,18 +471,28 @@ func (p *parser) parseFunction() (FunctionDecl, error) {
if err != nil {
return FunctionDecl{}, err
}
function := FunctionDecl{
Name: signature.Name,
TypeParams: signature.TypeParams,
Params: signature.Params,
ReturnType: signature.ReturnType,
ReturnExplicit: signature.ReturnExplicit,
}
if p.match(tokenAssign) {
expression, err := p.parseExpr(0)
if err != nil {
return FunctionDecl{}, err
}
function.ExpressionBody = expression
function.InferReturn = !signature.ReturnExplicit
return function, nil
}
body, err := p.parseBlock()
if err != nil {
return FunctionDecl{}, err
}
return FunctionDecl{
Name: signature.Name,
TypeParams: signature.TypeParams,
Params: signature.Params,
ReturnType: signature.ReturnType,
Body: body,
}, nil
function.Body = body
return function, nil
}
func (p *parser) parseFunctionSignature() (FunctionSignature, error) {
@ -509,7 +519,9 @@ func (p *parser) parseFunctionSignature() (FunctionSignature, error) {
}
returnType := "Unit"
returnExplicit := false
if p.match(tokenColon) {
returnExplicit = true
typ, err := p.parseTypeRef()
if err != nil {
return FunctionSignature{}, err
@ -518,10 +530,11 @@ func (p *parser) parseFunctionSignature() (FunctionSignature, error) {
}
return FunctionSignature{
Name: name.lexeme,
TypeParams: typeParams,
Params: params,
ReturnType: returnType,
Name: name.lexeme,
TypeParams: typeParams,
Params: params,
ReturnType: returnType,
ReturnExplicit: returnExplicit,
}, nil
}