В чем разница между сущностями, переменными, полями и аргументами в Eiffel?

Я видел термины сущность, переменная и аргумент, используемые для описания вещей об Эйфеле, которые мне очень нравятся, и я хотел чтобы понять, что намерение стоит за использованием одного термина вместо другого.

Аргументы. Некоторым подпрограммам для работы требуются некоторые данные. Представьте себе вымышленную функцию foo (x, y: INTEGER; z: BOOLEAN). Эта процедура принимает 3 аргумента: x, y и z. Когда вы вызываете подпрограмму, вы должны указать ей три действительных аргумента, например foo(6, 92, False). Эти значения, которые мы передали в подпрограмму, называются фактическими аргументами, а заполнители, определенные в определении, называются формальными аргументами.

Я читал о полях объекта, которые определяют место внутри структуры объекта, где хранятся значения (ссылки или развернутые объекты).

Думаю, я видел термин переменные только для локальных переменных внутри функций.

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

И в какую категорию попали бы Current и Result? Локальные переменные?

Может ли кто-нибудь помочь мне с терминологией?


person g4v3    schedule 08.06.2017    source источник
comment
Я отмечу ответ @Alexander Kogtenkov как принятый. Этот ответ подробно показывает, как терминология определяется спецификацией языка. Я нашел это очень ясным и легким для понимания. `Ответ @Emmanuel Stapf больше похож на подведение итогов, дополняющих другой ответ. Читать его сразу после этого приятно, но это не обязательно для понимания терминологии.   -  person g4v3    schedule 16.06.2017
comment
@Emmanuel Stapf, см. Предыдущий комментарий.   -  person g4v3    schedule 16.06.2017


Ответы (2)


Технические характеристики

Согласно ISO / IEC 25436: 2006 (E) и недавно добавленным языковым конструкциям:

Термины на основе синтаксиса

Локальная переменная может быть любой из следующих:

  • идентификатор, объявленный в части Local_declarations (тела функции, включая встроенные агенты)
  • предопределенная сущность Result

Формальный аргумент:

  • идентификатор для представления информации, передаваемой вызывающими абонентами

Фактический аргумент:

  • выражение в конкретном вызове процедуры

Атрибут переменной - это объявление функции, удовлетворяющее всем следующим требованиям:

  • нет никаких формальных аргументов
  • есть метка запроса (т.е. имеет тип)
  • нет явного значения (т.е. это не константа)
  • если есть тело, оно имеет вид атрибута

Постоянный атрибут - это объявление функции, удовлетворяющее всем следующим требованиям:

  • нет никаких формальных аргументов
  • есть метка запроса (т.е. имеет тип)
  • есть явное значение

Коллективные условия

Переменная может быть любой из следующих:

  • окончательное имя атрибута переменной
  • локальная переменная (включая Result)

Сущность, доступная только для чтения, может быть любой из следующих:

  • формальный аргумент
  • локальный объект тестирования
  • локальный курсорчасти итерации цикла)
  • отдельный локальныйотдельной_инструкции)
  • постоянный атрибут
  • Current

Сущность может быть любой из следующих:

  • переменная
  • объект только для чтения

Запрос может быть любым из следующего:

  • атрибут
  • функция

Т.е. запрос - это функция, которая имеет тип и может использоваться для получения значения во время выполнения.

Семантические термины

Поле:

  • значение в прямом экземпляре неосновного типа, соответствующее атрибуту

Пример

class C feature
   pi: REAL_32 = 3.14
   double (x: LIST [INTEGER]): LIST [INTEGER]
      local
         r: ARRAYED_LIST [INTEGER]
      do
         create r.make (x.count)
         across x as c loop
            r.extend (c.item * 2)
         end
         Result := r
      end
   average_age: NATURAL
   count: NATURAL
   print_list (x: LIST [PERSON])
      do
         average_age := 0
         count := 0
         x.do_all (agent (p: PERSON)
            do
               if attached p.name as n then
                  io.put_string (n + ": " + p.age.out + "%N")
                  average_age := average_age + p.age
                  count := count + 1
               end
            end)
          if count > 0 then
             average_age := average_age // count
          end
      end
end

Термины на основе синтаксиса

Локальная переменная: r, Result.

Местный объект тестирования: n.

Курсор локальный: c.

Формальный аргумент: x, p.

Фактический аргумент: x.count, 2 (это аргумент для умножения), c.item * 2, ": " (в конкатенации строк), p.age.out, "%N", n + ": " + p.age.out + "%N", p.age, 1, 0, count (в делении).

Атрибут переменной: average_age, count.

Постоянный атрибут: pi.

Коллективные условия

Переменная: r, Result, average_age, count.

Сущность только для чтения: pi, n, c, x, p.

Сущность: pi, r, Result, average_age, count, n, c, x, p.

Запрос: pi, double, average_age, count.

person Alexander Kogtenkov    schedule 09.06.2017
comment
Вы забыли включить постоянные атрибуты в объекты только для чтения? - Я полагаю, что ISO / IEC 25436: 2006 (E) и ECMA-367 (2-е издание / июнь 2006 г.) имеют очень мало различий в содержании, если таковые имеются. Если раздел 8.19.7 Определение: сущность, переменная, только для чтения равен в обоих документах, то постоянные атрибуты [...] являются сущностями только для чтения. . (sic для полужирный). - person g4v3; 11.06.2017
comment
@ g4v3, да, спасибо за улов. Текст исправлен, включая пример. - person Alexander Kogtenkov; 11.06.2017

Вы увидите четкие определения этих терминов в спецификации ECMA Eiffel (Стандарт ECMA-367, раздел 8: Спецификация языка).

Обобщить:

Сущность может быть либо аргументом, либо локальным, либо атрибутом (включая постоянный атрибут), Current или Result.

Переменная - это локальный атрибут или атрибут (не включая постоянный атрибут). Однако мы часто считаем Result как если бы это были псевдо-локальные переменные, поэтому было бы нормально называть его также переменной, но стандарт этого не делает.

Обратите внимание, что ни одна из вышеперечисленных процедур не включает подпрограммы (т.е. процедуры или функции, также известные как команды и запросы в терминологии Eiffel).

person Emmanuel Stapf    schedule 09.06.2017
comment
В ECMA-367 (2-е издание / июнь 2006 г.) в разделе 8.8.9 Определение: локальная переменная говорится, что локальные переменные подпрограммы включают [ ...], если это запрос, предопределенная сущность Результат. См. также Информационный текст, который следует ниже, для получения более подробной информации. Не могли бы вы обновить свой ответ? - person g4v3; 16.06.2017