multiple assign
This commit is contained in:
4
specs.md
4
specs.md
@@ -849,6 +849,7 @@ Statements are terminated by `;`.
|
||||
|
||||
- **Declaration**: `name :: value;` / `name := value;`
|
||||
- **Assignment**: `name = value;` / `name += value;` (and other compound assignments). Also supports field targets: `obj.field = value;`
|
||||
- **Multi-target assignment**: `a, b = b, a;` — all RHS values are evaluated before any stores, enabling swaps without temporaries. Target count must equal value count. Only plain `=` is supported (no compound operators). Each target must be a valid lvalue (variable, field, index, dereference).
|
||||
- **Expression statement**: `expr;` — evaluates the expression (last in a block = return value)
|
||||
- **Return**: `return expr;` — returns from the enclosing function with the given value. `return;` returns void.
|
||||
- **Break**: `break;` — exits a match arm or while loop
|
||||
@@ -1059,7 +1060,7 @@ field_group = IDENT (',' IDENT)* ':' type ('=' expr)? ';'
|
||||
params = param (',' param)*
|
||||
param = IDENT ':' type
|
||||
block = '{' stmt* '}'
|
||||
stmt = decl | assignment ';' | return_stmt | defer_stmt | insert_stmt
|
||||
stmt = decl | assignment ';' | multi_assign ';' | return_stmt | defer_stmt | insert_stmt
|
||||
| break_stmt | continue_stmt | expr ';'
|
||||
return_stmt = 'return' expr? ';'
|
||||
break_stmt = 'break' ';'
|
||||
@@ -1067,6 +1068,7 @@ continue_stmt = 'continue' ';'
|
||||
defer_stmt = 'defer' expr ';'
|
||||
insert_stmt = '#insert' expr ';'
|
||||
assignment = lvalue ('=' | '+=' | '-=' | '*=' | '/=') expr
|
||||
multi_assign = lvalue (',' lvalue)+ '=' expr (',' expr)+
|
||||
lvalue = IDENT | postfix '.' IDENT
|
||||
expr = if_expr | match_expr | while_expr | for_expr | lambda | binary
|
||||
while_expr = 'while' expr block
|
||||
|
||||
Reference in New Issue
Block a user