Первоклассный гражданин - First-class citizen
В программировании язык дизайна , в первый класс гражданина ( в том числе тип , объект , субъект , или значение ) в данном языке программирования является юридическим лицом , которое поддерживает все операции , как правило , доступны для других лиц. Эти операции обычно включают передачу в качестве аргумента, возвращение из функции, изменение и присвоение переменной.
История
Понятие объектов первого и второго класса было введено Кристофером Стрейчи в 1960-х годах. На самом деле он не определял термин строго, но противопоставлял действительные числа и процедуры в АЛГОЛЕ :
Объекты первого и второго класса. В ALGOL действительное число может появиться в выражении или быть присвоено переменной, и любое из них может появиться как фактический параметр при вызове процедуры. С другой стороны, процедура может появляться только в другом вызове процедуры либо как оператор (наиболее распространенный случай), либо как один из фактических параметров. Нет других выражений, включающих процедуры или результаты которых являются процедурами. Таким образом, в некотором смысле процедуры в ALGOL являются гражданами второго сорта - они всегда должны появляться лично и никогда не могут быть представлены переменной или выражением (за исключением случая формального параметра) ...
Робин Попплстоун дал следующее определение: Все предметы имеют определенные основные права.
- Все элементы могут быть фактическими параметрами функций.
- Все элементы могут быть возвращены как результаты функций
- Все элементы могут быть предметом заявлений о назначении
- Все предметы можно проверить на равенство.
В 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 , имеют подсистему явного отражения, которая разрешает доступ к внутренним структурам реализации, даже если они недоступны или недоступны для управления так же, как обычные объекты.