Break

From Lazarus wiki

Deutsch (de) English (en) español (es) suomi (fi) français (fr) русский (ru)

The break routine effectively destroys a loop. Its primary application is to exit a loop prior its planned end.

Break, with its special meaning of abandoning a loop, can only be written within loops. It is not a reserved word¹, therefore you could shadow it, but access it by writing the fully qualified identfier system.break at any time, though.

Collatz conjecture

Example: The following program tackles the Collatz problem. The for-loop in collatzIterative uses a break, a) to check for the terminating condition according to Collatz' problem, b) to abort prior reaching the data type's boundaries, and c) while still using the advantage of the for-construct (i.e. automatically incrementing a variable within a specified range).

 1 program collatz(input, output, stderr);
 2 
 3 procedure collatzIterative(n: qword);
 4 var
 5 	i: qword;
 6 begin
 7 	for i := 0 to high(i) do
 8 	begin
 9 		writeLn('step ', i:20, ': ', n);
10 		
11 		// Collatz conjecture: sequence ends with 1
12 		if (n = 1) or (n > (high(n) / 3 - 1)) then
13 		begin
14 			// leave loop, as next value may get out of range
15 			break;
16 		end;
17 		
18 		// n := ifThen(odd(n), 3 * n + 1, n div 2);
19 		if odd(n) then
20 		// n is odd
21 		begin
22 			n := 3 * n + 1;
23 		end
24 		// n is even
25 		else
26 		begin
27 			n := n div 2;
28 		end;
29 	end;
30 end;
31 
32 var
33 	n: longword;
34 begin
35 	readLn(n);
36 	
37 	if n < 1 then
38 	begin
39 		writeLn(stderr, 'not a positive integer');
40 		halt(1);
41 	end;
42 	
43 	collatzIterative(n);
44 end.

Choosing a for-loop in conjunction with a break is adequate, since the Collatz conjecture hypothesizes that the described function eventually ends in 1, but does not tell for sure. Therefore – mathematically speaking – writing while n <> 1 do does not consider the circumstance, that the problem is an assumption, but would suggest it is determined to eventually result in n = 1.

Other remarks

However, the usage of break is usually considered as bad style, since it “delegitimizes” the loop's condition expression. You have to know a loop's statement block contains a break to determine all abort conditions.

According to the GPC manual, break is a Borland Pascal extension, whereas Mac Pascal has leave. FPC, apart from {$mode macpas}, only knows break, though.

See also

sources

1
compare remarks in the reference manual § “The For..to/downto..do statement” and § “reserved words”