Многострочный строковый литерал в Ada - PullRequest
1 голос
/ 23 октября 2019

Как я могу создать в Ada строку, содержащую переводы строк, определение которых также содержит эти переводы строк?

Я пробовал с обратным слешем 0..2 в конце строки, но ничего из этого не компилируется:

   usage_info : String := "\
This should be the first line
and both the definition and the output
should contain newlines.";

В PHP это будет:

<<<BLOCK
1
2
3
BLOCK;

В C ++ это будет:

const std::string s = "\
1
2
3";

В C #, это будет:

const string s =
@"1
2
3";

Ответы [ 2 ]

6 голосов
/ 23 октября 2019

Из того, что я знаю, Ada, как и Java, не поддерживает многострочный литерал. Единственное, что я вижу, это что-то вроде этого:

usage_info : String := "This should be the first line" & CR & LF
                     & "and both the definition and the output" & CR & LF 
                     & "should contain newlines.";

Конечно, вам нужно с и использовать Ada.Characters.Latin_1 сделать эти константы видимыми.

1 голос
/ 23 октября 2019

Дополнение к ответу Frédéric Praca:

В зависимости от ваших потребностей вы можете использовать пакет ASCII вместо Ada.Characters.* (например, Latin_1, Latin_9, Wide_Latin_ .. и т. Д.). ASCII не может быть with 'ed, поскольку это не пакет, поэтому вам придется все префиксировать (или определять «псевдонимы», используя renames)

declare
    flex : constant String := "Foo" & ASCII.CR & "bar" & ASCII.LF;
    flux : constant String := "Foo" & ASCII.CR
                            & "bar" & ASCII.LF;
begin
    -- do stuff
    null;
end;

Oneможет определить пользовательский оператор &, чтобы использовать его в качестве новой точки вставки строки. Но ... насколько это полезно?

function Foo (Left, Right : String) return String renames "&";
function Boo (Left : String; Right : Character) return String renames "&";

function "&" (Left, Right : String) return String is begin
   return Foo (
               Boo (Left, ASCII.LF),
               Right);
end "&";

Ada.Text_IO.Put_Line("Foo" &
                     "bar");
...