-- Demonstrates a general loop with a loop and a half structure
-- and the same sequence of operations implemented with a while loop
with ada.text_io; use ada.text_io;
with ada.integer_text_io; use ada.integer_text_io;
procedure loop_and_a_half is
x: integer;
begin
-- print squares of positive numbers
loop
get(x);
exit when x < 0;
put(x * x); -- Process x by printing its square
end loop;
-- Sequence of operations: get, test, process, get, test, process, get, test, exit
-- The code above naturally matches the sequence of operations.
-- Disadvantage: Some to never exit a loop in the middle.
-- It should be clear what the exit condition is from reading the loop statement
-- print squares of positive numbers, again
get(x);
while x > 0 loop
put(x * x); -- Process x by printing its square
get(x);
end loop;
-- Sequence of operations: get, test, process, get, test, process, get, test, exit
-- Disadvantage: code to get(x) is repeated. In this case it's only one line,
-- but other cases may be more complicated.
end loop_and_a_half;