Побочный эффект буферизации Ada.Text_IO.End_Of_File - PullRequest
3 голосов
/ 28 января 2020

Я пытаюсь построить 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

1 Ответ

5 голосов
/ 28 января 2020

Поскольку End_Of_File требует ввода пользователя, просто поместите его туда, где вы читаете ввод пользователя:

loop
   L := L + 1;
   Put ("--> ");
   exit when End_Of_File;
   Buffer := To_Unbounded_String (Get_Line);
   Put_Line (Integer'Image(L) & " " & To_String (Buffer));
end loop;
...