@@ -1577,12 +1577,19 @@ impl Parser {
15771577 self . tokens = saved;
15781578 }
15791579 }
1580- self . expect ( Token :: LBrace ) ?;
1581- let mut body: Vec < Statement > = Vec :: new ( ) ;
1582- while self . current ( ) != Token :: RBrace {
1583- body. push ( self . parse_statement ( ) ?) ;
1584- }
1585- self . expect ( Token :: RBrace ) ?;
1580+ // Braced body `fn(p) { stmts }` or single-expr body `fn(p) expr`.
1581+ let body = if self . current ( ) == Token :: LBrace {
1582+ self . advance ( ) ;
1583+ let mut stmts: Vec < Statement > = Vec :: new ( ) ;
1584+ while self . current ( ) != Token :: RBrace {
1585+ stmts. push ( self . parse_statement ( ) ?) ;
1586+ }
1587+ self . expect ( Token :: RBrace ) ?;
1588+ stmts
1589+ } else {
1590+ let e = self . parse_expression ( ) ?;
1591+ vec ! [ Statement :: Return ( Some ( e) ) ]
1592+ } ;
15861593 Ok ( Expression :: Lambda { params, body } )
15871594 }
15881595
@@ -1886,6 +1893,35 @@ impl Parser {
18861893 self . expect ( Token :: RParen ) ?;
18871894 Ok ( Expression :: Call { name : "range" . to_string ( ) , args, pos } )
18881895 }
1896+ // `if cond { stmts } else { stmts }` as an expression.
1897+ // Value is the last expr-statement in the taken branch.
1898+ Token :: If => {
1899+ self . advance ( ) ;
1900+ let condition = self . parse_expression ( ) ?;
1901+ self . expect ( Token :: LBrace ) ?;
1902+ let then_body = self . parse_block ( ) ?;
1903+ self . expect ( Token :: RBrace ) ?;
1904+ let else_body = if self . current ( ) == Token :: Else {
1905+ self . advance ( ) ;
1906+ // else if → wrap in a nested IfExpr as the else branch
1907+ if self . current ( ) == Token :: If {
1908+ let nested = self . parse_primary ( ) ?; // recurse → IfExpr
1909+ Some ( vec ! [ Statement :: Expression ( nested) ] )
1910+ } else {
1911+ self . expect ( Token :: LBrace ) ?;
1912+ let body = self . parse_block ( ) ?;
1913+ self . expect ( Token :: RBrace ) ?;
1914+ Some ( body)
1915+ }
1916+ } else {
1917+ None
1918+ } ;
1919+ Ok ( Expression :: IfExpr {
1920+ condition : Box :: new ( condition) ,
1921+ then_body,
1922+ else_body,
1923+ } )
1924+ }
18891925 other => Err ( format ! (
18901926 "at {}: Unexpected token in expression: {}" ,
18911927 self . current_pos( ) ,
0 commit comments