Ада поддержка переменных в put_line's? - PullRequest
1 голос
/ 25 января 2012

Ада поддерживает ли что-то похожее на переменную Obj-C в строке?

NSLog(@"This is text, here's a variable %f", floatvar);

Я хотел бы написать хорошие однострочные, как:
put_line("The answer is %v", answer);

вместо

put_line("The answer is ");<br> put(answer);

Ответы [ 2 ]

4 голосов
/ 25 января 2012

Вам может понравиться FAQ по Ada, в частности part 9.9 .Для полноты я приведу здесь:

Хотя стандартный пакет Text_IO предоставляет множество функций, запрос
для функции, похожей на printf, не является чем-то необычным.

(на основе решенияпо предложению Такера Тафта)

Можно создать возможность, похожую на printf, перегрузив оператор "&", чтобы взять объект типа Format и объект некоторого типа и вернуть должным образом расширенный форматпосле выполнения соответствующего вывода.Оставшийся формат можно преобразовать обратно в строку - например, чтобы проверить, что осталось в конце строки формата - или просто распечатать, чтобы отобразить все, что осталось в конце.Например:

 with Text_IO;
 package Formatted_Output is
   type Format is
     limited private;

   function Fmt (Str : String)
     return Format;

   function "&" (Left : Format; Right : Integer)
     return Format;
   function "&" (Left : Format; Right : Float)
     return Format;
   function "&" (Left : Format; Right : String)
     return Format;
   ... -- other overloadings of "&"

   procedure Print (Fmt : Format);

   function To_String (Fmt : Format)
     return String;

 private
   ...
 end Formatted_Output;

 with Formatted_Output; use Formatted_Output;
 procedure Test is
   X, Y : Float;
 begin
   Print (Fmt("%d * %d = %d\n") & X & Y & X*Y);
 end Test;

Закрытая часть и тело Formatted_Output оставлены в качестве упражнения для читателя; -).

Параметр «File: File_Type» может быть добавлен к перегрузкеFmt, если необходимо (для создания чего-то аналогичного fprintf).

Эта возможность аналогична возможности, предоставляемой оператором "<<" stream <br>в C ++.

3 голосов
/ 25 января 2012

Если у вас есть F : Float;, вы можете сказать

Put_Line (“the answer is “ & Float’Image (F));

Это не очень хорошо работает, если вы хотите аккуратное форматирование, потому что формат вывода ’Image фиксирован , как указанов ARM (эта ссылка на самом деле ’Wide_Wide_Image, а не ’Image, но формат тот же).

Если вы используете GNAT, вы можете написать выше как

Put_Line (“the answer is “ & F'Img);

, который сохраняет (a) символы и (b) запоминание соответствующего типа, но это не переносимо.

...