Почему, если выражения и если заявления в Ада, а также для случая - PullRequest
3 голосов
/ 26 апреля 2019

Взято из Введение в Аду - Если выражения :

Выражения if Ады аналогичны операторам if.Однако есть несколько отличий, связанных с тем, что это выражение:

Все выражения ветвей должны быть одного типа

Оно должно быть окруженов скобках, если окружающее выражение их еще не содержит

Ветвь else обязательна, если выражение, следующее за then, не имеет логического значения.В этом случае ветвь else является необязательной и, если ее нет, по умолчанию используется else True.

Я не понимаю необходимости двух разных способов конструирования кода с ключевым словом if.В чем причина этого?

Также есть case выражений и case выражений.Почему это?

Ответы [ 3 ]

5 голосов
/ 26 апреля 2019

Я думаю, что на этот вопрос лучше всего ответить цитированием Обоснования Ады 2012 Глава 3.1 :

Одна из ключевых областей, определенных в руководящем документе WG9 [1] как нуждающегося во внимании, улучшается способность писать и применять контракты. Они подробно обсуждались в предыдущей главе. При определении новых аспектов для предусловий, постусловий, типа инварианты и предикаты подтипа стало ясно, что без более гибкие формы выражений, многие функции должны быть введен, потому что во всех случаях аспект был задан выражением. Тем не менее, объявление функции и, таким образом, дает детали условие, инвариант или предикат в теле функции делает Подробности контракта довольно отдаленные для человека читателя. Информация скрытие, как правило, хорошая вещь, но в этом случае оно просто вводит неясность. Введены четыре формы, а именно, если выражения, регистр выражения, количественные выражения и функции выражений. Все вместе они дают Аде гибкое ощущение функционального языка.

Кроме того, операторы if и операторы case часто присваивают разные значения одной и той же переменной во всех ветвях и ничего больше:

if Foo > 10 then
   Bar := 1;
else
   Bar := 2;
end if;

В этом случае выражение if может повысить читабельность и более четко указать в коде, что происходит:

Bar := (if Foo > 10 then 1 else 2);

Теперь мы можем видеть, что для сопровождающего кода больше нет необходимости читать весь оператор if, чтобы видеть, что обновляется только одна переменная.

То же самое относится к case выражениям, что также может уменьшить потребность во вложении if выражений.

Кроме того, я могу задать вам вопрос: почему языки на основе Си имеют троичный оператор ?: в дополнение к операторам if?

3 голосов
/ 26 апреля 2019

Egilhh уже рассмотрел основную причину, но иногда есть другие полезные причины для реализации выражений. Иногда вы создаете пакеты, где требуется только один или два метода, и они являются единственной причиной создания тела пакета. Вы можете использовать выражения для создания функций выражений, которые позволяют вам определять операции в файле спецификации.

Кроме того, если вы когда-нибудь столкнетесь с какими-то сложными комбинациями записей вариантов, иногда выражения можно использовать для установки значений по умолчанию для них в тех случаях, когда вы обычно не сможете сделать это так чисто. Рассмотрим следующий пример:

with Ada.Text_IO; use Ada.Text_IO;

procedure Hello is

    type Binary_Type is (On, Off);

    type Inner(Binary : Binary_Type := Off) is  record
        case Binary is
            when On =>
                Value : Integer := 0;
            when Off =>
                null;
        end case;
    end record;

    type Outer(Some_Flag : Boolean) is record
        Other : Integer := 32;
        Thing : Inner   := (if Some_Flag then 
                              (Binary => Off) 
                            else 
                              (Binary => On, Value => 23));
    end record;

begin
  Put_Line("Hello, world!");
end Hello;

У меня было что-то, что придумало более сложную настройку, предназначенную для сопоставления со сложным интерфейсом обмена сообщениями на аппаратном уровне. Приятно иметь значения по умолчанию, когда это возможно. Теперь я использовал случай внутри Outer, но тогда мне пришлось бы придумать две отдельно названные версии поля сообщения для каждого случая, что на самом деле не оптимально, если вы хотите, чтобы ваш код отображался в ICD. Опять же, я мог бы использовать функцию для ее инициализации, но, как отмечалось в ответе других авторов, это не всегда хороший путь.

2 голосов
/ 27 апреля 2019

Еще одно место, в котором излагается мотивация для добавления условных выражений в Ada, можно найти в документе ARG, AI05-0147-1 , в котором объясняется мотивация и приводятся некоторые примеры использования.

Пример места, где я нахожу их весьма полезными, относится к обработке параметров командной строки, для случая, когда используется значение по умолчанию, если параметр не указан в командной строке. Как правило, вы хотите объявить такие значения как константы в своей программе. Условные выражения облегчают это.

with Ada.Command_Line; use Ada;

procedure Main
is
   N : constant Positive :=
     (if Command_Line.Argument_Count = 0 then 2_000_000
      else Positive'Value (Command_Line.Argument (1)));
   ...

В противном случае, без условных выражений, для достижения того же эффекта вам нужно объявить функцию, которую я считаю более трудной для чтения;

with Ada.Command_Line; use Ada;

procedure Main
is

   function Get_N return Positive is
   begin
      if Command_Line.Argument_Count = 0 then
         return 2_000_000;
      else
         return Positive'Value (Command_Line.Argument (1));
      end if;
   end Get_N;

   N : constant Positive := Get_N;
   ...
...