Я пытаюсь построить REPL в Аде, не касаясь языка в течение многих лет.
Если я проверю END_OF_FILE в коде, то способ, которым Text_IO буферизует ввод и вывод, изменяется. Я помню, что это так, но не могу найти описание, почему или как с этим бороться. (Я подозреваю, что это разница между терминальным IO и файловым IO)
Может кто-нибудь указать мне описание того, почему Text_IO ведет себя так?
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Exceptions; use Ada.Exceptions;
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
procedure fred is
Buffer: Unbounded_String := Null_Unbounded_String;
L : integer := 0;
begin
-- while (not End_Of_File)
loop
L := L+1;
put("--> ");
Buffer := To_Unbounded_String(Get_Line);
Put_Line(Integer'image(L) & " " & to_String(Buffer));
end loop;
exception
when END_ERROR =>
put_line("");
put_line("Bye ...");
end fred;
Запуск этого кода как есть дает
--> a
1 a
--> s
2 s
--> d
3 d
-->
Bye ...
Если я раскомментирую оператор , а , я получу
a
--> 1 a
s
--> 2 s
d
--> 3 d