From 048f506aa6b78dd13a593b6bb12a317c5a047bc7 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Mon, 27 Aug 2018 20:59:28 -0400 Subject: [PATCH] langref: document labeled blocks, labeled for, labeled while closes #1327 --- doc/langref.html.in | 86 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/doc/langref.html.in b/doc/langref.html.in index 495b19580..31d923e84 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -2179,6 +2179,39 @@ test "@tagName" { sorts the order of the tag and union field by the largest alignment.

{#header_close#} + {#header_open|blocks#} +

+ Blocks are used to limit the scope of variable declarations: +

+ {#code_begin|test_err|undeclared identifier#} +test "access variable after block scope" { + { + var x: i32 = 1; + } + x += 1; +} + {#code_end#} +

Blocks are expressions. When labeled, break can be used + to return a value from the block: +

+ {#code_begin|test#} +const std = @import("std"); +const assert = std.debug.assert; + +test "labeled break from labeled block expression" { + var y: i32 = 123; + + const x = blk: { + y += 1; + break :blk y; + }; + assert(x == 124); + assert(y == 124); +} + {#code_end#} +

Here, blk can be any name.

+ {#see_also|Labeled while|Labeled for#} + {#header_close#} {#header_open|switch#} {#code_begin|test|switch#} const assert = @import("std").debug.assert; @@ -2374,6 +2407,28 @@ fn rangeHasNumber(begin: usize, end: usize, number: usize) bool { } else false; } {#code_end#} + {#header_open|Labeled while#} +

When a while loop is labeled, it can be referenced from a break + or continue from within a nested loop:

+ {#code_begin|test#} +test "nested break" { + outer: while (true) { + while (true) { + break :outer; + } + } +} + +test "nested continue" { + var i: usize = 0; + outer: while (i < 10) : (i += 1) { + while (true) { + continue :outer; + } + } +} + {#code_end#} + {#header_close#} {#header_open|while with Optionals#}

Just like {#link|if#} expressions, while loops can take an optional as the @@ -2560,6 +2615,37 @@ test "for else" { }; } {#code_end#} + {#header_open|Labeled for#} +

When a for loop is labeled, it can be referenced from a break + or continue from within a nested loop:

+ {#code_begin|test#} +const std = @import("std"); +const assert = std.debug.assert; + +test "nested break" { + var count: usize = 0; + outer: for ([]i32{ 1, 2, 3, 4, 5 }) |_| { + for ([]i32{ 1, 2, 3, 4, 5 }) |_| { + count += 1; + break :outer; + } + } + assert(count == 1); +} + +test "nested continue" { + var count: usize = 0; + outer: for ([]i32{ 1, 2, 3, 4, 5, 6, 7, 8 }) |_| { + for ([]i32{ 1, 2, 3, 4, 5 }) |_| { + count += 1; + continue :outer; + } + } + + assert(count == 8); +} + {#code_end#} + {#header_close#} {#header_open|inline for#}

For loops can be inlined. This causes the loop to be unrolled, which