Ada.Text_IO.End_Of_File 缓冲副作用

EBo*_*lar 3 io ada

在多年没有接触该语言之后,我正在尝试在 Ada 中构建一个 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;
Run Code Online (Sandbox Code Playgroud)

按原样运行此代码给出

--> a
 1 a
--> s
 2 s
--> d
 3 d
-->
Bye ...
Run Code Online (Sandbox Code Playgroud)

如果我取消注释while语句,我会得到

a
-->  1 a
s
-->  2 s
d
-->  3 d
Run Code Online (Sandbox Code Playgroud)

fly*_*lyx 5

由于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;
Run Code Online (Sandbox Code Playgroud)