Caution
You’re reading a draft of the Ferrocene Language Specification. Some parts of this document might be missing, incomplete or incorrect. Our aim is to have the specification ready by the end of 2022.
8. Statements¶
Syntax
Statement
::=ExpressionStatement
|Item
|LetStatement
|TerminatedMacroInvocation
| ;
Legality Rules
8:1 An expression statement is an expression whose result is ignored.
8:2 An item statement is a statement that is expressed as an item.
8:3 An empty statement is a statement expressed as character 0x3B (semicolon).
8:4 A macro statement is a statement expressed as a terminated macro invocation.
Dynamic Semantics
8:5 Execution is the process by which a statement achieves its runtime effects.
8:6 The execution of an empty statement has no effect.
8.1. Let Statements¶
Syntax
LetStatement
::=OuterAttributeOrDoc
* letPatternWithoutAlternation
TypeAscription
?LetInitializer
? ;LetInitializer
::= =Expression
(elseBlockExpression
)?
Legality Rules
8.1:1 A let statement is a statement that introduces new bindings produced by its pattern-without-alternation that are optionally initialized to a value.
8.1:2 A let initializer is a construct that provides the value of the bindings of the let statement using an expression, or alternatively executes a block expression.
8.1:3 If a let statement lacks a block expression, then the pattern of the let statement shall be an irrefutable pattern.
8.1:4 The type of a binding introduced by a let statement is determined as follows:
8.1:5 If the let statement appears with a type ascription, then the type is the type specified by the type ascription.
8.1:6 If the let statement lacks a type ascription, then the type is inferred using type inference.
8.1:7 The type of the block expression of a let statement shall be the never type.
8.1:8 The value of a binding introduced by a let statement is determined as follows:
8.1:9 If the let statement appears with a let initializer, then the value is the value of the expression of the let initializer.
8.1:10 Otherwise the binding is uninitialized.
Dynamic Semantics
8.1:11 The execution of a let statement with a let initializer proceeds as follows:
8.1:12 The expression of the let initializer is evaluated.
8.1:13 If the value of the expression is matched successfully against the pattern of the let statement, then the value is assigned to each binding introduced by the let statement.
8.1:14 Otherwise the block expression of the let initializer is evaluated.
Examples
let local = 0;
let local: u32;
let (a, b) = (0, 0);
let Some(value) = vector.pop() else {
panic!();
};
8.2. Expression Statements¶
Syntax
ExpressionStatement
::=ExpressionWithBlock
;? |ExpressionWithoutBlock
;
Legality Rules
8.2:1 An expression statement is an expression whose result is ignored.
8.2:2 The expected type of an expression statement without character 0x3B (semicolon) is the unit type.
Dynamic Semantics
8.2:3 The execution of an expression statement proceeds as follows:
Examples
let mut values = vec![1, 2, 3];
8.2:6
The following expression statement ignores the result from pop()
.
values.pop();
8.2:7 The following expression statement does not require a semicolon.
if values.is_empty() {
values.push(42);
}
else {
values.remove(0);
}
8.2:8 The following expression statement is not an index expression.
[42];