Remove `do ... while` loops from the tests and docs.

This commit is contained in:
Paul Stansifer 2012-05-10 14:06:19 -07:00
parent 13c924c049
commit f943667af3
15 changed files with 45 additions and 79 deletions

View File

@ -1991,28 +1991,19 @@ way.
*TODO*.
### While expressions
### While loops
~~~~~~~~{.ebnf .gram}
while_expr : "while" expr '{' block '}'
| "do" '{' block '}' "while" expr ;
~~~~~~~~
A `while` expression is a loop construct. A `while` loop may be either a
simple `while` or a `do`-`while` loop.
A `while` loop begins by evaluating the boolean loop conditional expression.
If the loop conditional expression evaluates to `true`, the loop body block
executes and control returns to the loop conditional expression. If the loop
conditional expression evaluates to `false`, the `while` expression completes.
In the case of a simple `while`, the loop begins by evaluating the boolean
loop conditional expression. If the loop conditional expression evaluates to
`true`, the loop body block executes and control returns to the loop
conditional expression. If the loop conditional expression evaluates to
`false`, the `while` expression completes.
In the case of a `do`-`while`, the loop begins with an execution of the loop
body. After the loop body executes, it evaluates the loop conditional
expression. If it evaluates to `true`, control returns to the beginning of the
loop body. If it evaluates to `false`, control exits the loop.
An example of a simple `while` expression:
An example:
~~~~
# let mut i = 0;
@ -2024,18 +2015,6 @@ while i < 10 {
}
~~~~
An example of a `do`-`while` expression:
~~~~
# let mut i = 0;
# let println = io::println;
do {
println("hello\n");
i = i + 1;
} while i < 10;
~~~~
### Infinite loops
A `loop` expression denotes an infinite loop:

View File

@ -667,6 +667,15 @@ a specific value, are not allowed.
keyword `break` can be used to abort the loop, and `cont` can be used
to abort the current iteration and continue with the next.
~~~~
let mut cake_amount = 8;
while cake_amount > 0 {
cake_amount -= 1;
}
~~~~
`loop` is the preferred way of writing `while true`:
~~~~
let mut x = 5;
while true {
@ -679,17 +688,6 @@ while true {
This code prints out a weird sequence of numbers and stops as soon as
it finds one that can be divided by five.
There's also `while`'s ugly cousin, `do`/`while`, which does not check
its condition on the first iteration, using traditional syntax:
~~~~
# fn eat_cake() {}
# fn any_cake_left() -> bool { false }
do {
eat_cake();
} while any_cake_left();
~~~~
For more involved iteration, such as going over the elements of a
collection, Rust uses higher-order functions. We'll come back to those
in a moment.
@ -2496,12 +2494,12 @@ Here is the function which implements the child task:
fn stringifier(from_parent: comm::port<uint>,
to_parent: comm::chan<str>) {
let mut value: uint;
do {
loop {
value = comm::recv(from_parent);
comm::send(to_parent, uint::to_str(value, 10u));
} while value != 0u;
if value == 0u { break; }
}
}
~~~~
You can see that the function takes two parameters. The first is a

View File

@ -61,24 +61,6 @@ fn while_aliased_mut_cond(cond: bool, cond2: bool) {
}
}
fn do_while_aliased_mut(cond: bool) {
let mut v = ~3, w = ~4;
let mut _x = &mut w;
do {
borrow(v); //! ERROR loan of mutable local variable as immutable conflicts with prior loan
_x = &mut v; //! NOTE prior loan as mutable granted here
} while cond;
}
fn loop_in_block() {
let mut v = ~3, w = ~4;
let mut _x = &mut w;
uint::range(0u, 10u) {|_i|
borrow(v); //! ERROR loan of mutable local variable as immutable conflicts with prior loan
_x = &mut v; //! NOTE prior loan as mutable granted here
}
}
fn at_most_once_block() {
fn at_most_once(f: fn()) { f() }

View File

@ -4,7 +4,7 @@ fn foo() -> int {
let x: int;
let i: int;
do { i = 0; break; x = 0; } while x != 0
loop { i = 0; break; x = 0; }
log(debug, x);

View File

@ -4,7 +4,7 @@ fn foo() -> int {
let x: int;
let i: int;
do { i = 0; break; x = 0; } while 1 != 2
while 1 != 2 { i = 0; break; x = 0; }
log(debug, x);

View File

@ -1,14 +1,17 @@
// xfail-test
// https://github.com/mozilla/rust/issues/2374
// error-pattern:unsatisfied precondition constraint (for example, even(y
fn print_even(y: int) : even(y) { log(debug, y); }
pure fn even(y: int) -> bool { true }
fn main() {
let y: int = 42;
let mut y = 42;
check (even(y));
loop {
print_even(y);
do { do { do { y += 1; } while false } while false } while false
loop { y += 1; break; }
}
}

View File

@ -5,6 +5,6 @@ fn main() {
let x: int;
loop {
log(debug, y);
do { do { do { x <- y; } while true } while true } while true
while true { while true { while true { x <- y; } } }
}
}

View File

@ -1,2 +0,0 @@
// error-pattern:quux
fn main() { let x: int = do { fail "quux"; } while true; }

View File

@ -1,4 +0,0 @@
// error-pattern:giraffe
fn main() {
fail do { fail "giraffe" } while true;
}

View File

@ -0,0 +1,2 @@
// error-pattern:quux
fn main() { let x: int = { while true { fail "quux"; } ; 8 } ; }

View File

@ -0,0 +1,4 @@
// error-pattern:giraffe
fn main() {
fail { while true { fail "giraffe"}; "clandestine" };
}

View File

@ -4,7 +4,7 @@ fn main() {
let mut i = 0;
while i < 20 { i += 1; if i == 10 { break; } }
assert (i == 10);
do { i += 1; if i == 20 { break; } } while i < 30
loop { i += 1; if i == 20 { break; } }
assert (i == 20);
for vec::each([1, 2, 3, 4, 5, 6]) {|x|
if x == 3 { break; } assert (x <= 3);
@ -12,7 +12,10 @@ fn main() {
i = 0;
while i < 10 { i += 1; if i % 2 == 0 { cont; } assert (i % 2 != 0); }
i = 0;
do { i += 1; if i % 2 == 0 { cont; } assert (i % 2 != 0); } while i < 10
loop {
i += 1; if i % 2 == 0 { cont; } assert (i % 2 != 0);
if i >= 10 { break; }
}
for vec::each([1, 2, 3, 4, 5, 6]) {|x|
if x % 2 == 0 { cont; }
assert (x % 2 != 0);

View File

@ -1,8 +1,8 @@
fn main () {
let mut line = "";
let mut i = 0;
do {
while line != "exit" {
line = if i == 9 { "exit" } else { "notexit" };
i += 1;
} while line != "exit";
}
}

View File

@ -16,7 +16,7 @@ fn what() {
}
fn zombiejesus() {
do {
loop {
while (ret) {
if (ret) {
alt (ret) {
@ -33,7 +33,8 @@ fn zombiejesus() {
ret;
}
}
} while ret
if (ret) { break; }
}
}
fn notsure() {
@ -58,7 +59,7 @@ fn canttouchthis() -> uint {
fn angrydome() {
loop { if break { } }
let mut i = 0;
do { i += 1; if i == 1 { alt check cont { 1 { } } } } while false
loop { i += 1; if i == 1 { alt check cont { 1 { } } } break; }
}
fn evil_lincoln() { let evil <- #debug("lincoln"); }

View File

@ -4,9 +4,9 @@ fn main() {
let mut x: int = 10;
let mut y: int = 0;
while y < x { log(debug, y); #debug("hello"); y = y + 1; }
do {
while x > 0 {
#debug("goodbye");
x = x - 1;
log(debug, x);
} while x > 0
}
}