Первоклассный гражданин - First-class citizen

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

История

Понятие объектов первого и второго класса было введено Кристофером Стрейчи в 1960-х годах. На самом деле он не определял термин строго, но противопоставлял действительные числа и процедуры в АЛГОЛЕ :

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

Робин Попплстоун дал следующее определение: Все предметы имеют определенные основные права.

  1. Все элементы могут быть фактическими параметрами функций.
  2. Все элементы могут быть возвращены как результаты функций
  3. Все элементы могут быть предметом заявлений о назначении
  4. Все предметы можно проверить на равенство.

В 1990-е годы Рафаэль Финкель предложил определения ценностей второго и третьего класса, но эти определения не получили широкого распространения.

Примеры

Простейшие скалярные типы данных, такие как целые числа и числа с плавающей запятой, почти всегда первоклассны.

Во многих старых языках массивы и строки не являются первоклассными: они не могут быть назначены как объекты или переданы как параметры подпрограмме. Например, ни Fortran IV, ни C не поддерживают присвоение массивов, и когда они передаются в качестве параметров, фактически передается только позиция их первого элемента - их размер теряется. Кажется, что C поддерживает присвоение указателей массива , но на самом деле это просто указатели на первый элемент массива и опять же не несут размер массива.

В большинстве языков типы данных не являются объектами первого класса, хотя в некоторых объектно-ориентированных языках классы являются объектами первого класса и являются экземплярами метаклассов .

Немногие языки вообще поддерживают продолжения и GOTO- метки как объекты, не говоря уже о первоклассных объектах.

Концепция Описание Языки
первоклассная функция закрытие и анонимные функции Dart , Scheme , ML , Haskell , F # , Kotlin , Scala , Swift , PHP , Python , Raku , JavaScript , Delphi , Rust
первоклассный контроль продолжения Схема , ML , F #
первоклассный тип зависимые типы Кок , Идрис , Агда
первоклассный тип данных Общий Haskell , C ++ 11
первоклассный полиморфизм непредикативный полиморфизм
первоклассное сообщение динамические сообщения (вызовы методов) Smalltalk , Objective-C
первоклассный класс метакласс Smalltalk , Objective-C , Ruby , Python , Delphi
первоклассные доказательства объект доказательства Coq , Agda

Функции

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

Некоторые авторы требуют, чтобы во время выполнения можно было создавать новые функции, чтобы называть их «первоклассными». В результате функции в C не являются объектами первого класса; вместо этого их иногда называют объектами второго класса , потому что ими все еще можно манипулировать большинством вышеперечисленных способов (с помощью указателей на функции ).

В Smalltalk функции (методы) являются объектами первого класса, как и классы Smalltalk. Поскольку операторы Smalltalk (+, - и т. Д.) Являются методами, они также являются объектами первого класса.

Отражение

Некоторые языки, такие как Java и PHP , имеют подсистему явного отражения, которая разрешает доступ к внутренним структурам реализации, даже если они недоступны или недоступны для управления так же, как обычные объекты.

Смотрите также

использованная литература