First-class citizen
In programming language design, a first-class citizen (also type, object, entity, or value) in a given programming language is an entity which supports all the operations generally available to other entities. These operations typically include being passed as an argument, returned from a function, modified, and assigned to a variable.[1]
History
The concept of first- and second-class objects was introduced by Christopher Strachey in the 1960s.[2][3] He did not actually define the term strictly, but contrasted real numbers and procedures in ALGOL:
First and second class objects. In ALGOL, a real number may appear in an expression or be assigned to a variable, and either of them may appear as an actual parameter in a procedure call. A procedure, on the other hand, may only appear in another procedure call either as the operator (the most common case) or as one of the actual parameters. There are no other expressions involving procedures or whose results are procedures. Thus in a sense procedures in ALGOL are second class citizens—they always have to appear in person and can never be represented by a variable or expression (except in the case of a formal parameter)... [4]
Robin Popplestone gave the following definition: All items have certain fundamental rights.
- 1. All items can be the actual parameters of functions
- 2. All items can be returned as results of functions
- 3. All items can be the subject of assignment statements
- 4. All items can be tested for equality.
During the 1990s, Raphael Finkel[6] proposed definitions of second and third class values, but these definitions have not been widely adopted.[7]
Examples
The simplest scalar data types, such as integer and floating-point numbers, are nearly always first-class.
In many older languages, arrays and strings are not first-class: they cannot be assigned as objects or passed as parameters to a subroutine. For example, neither Fortran IV nor C supports array assignment, and when they are passed as parameters, only the position of their first element is actually passed—their size is lost. C appears to support assignment of array pointers, but in fact these are simply pointers to the array's first element, and again do not carry the array's size.
In most languages, data types are not first-class objects, though in some object-oriented languages, classes are first-class objects and are instances of metaclasses.
Few languages support continuations and GOTO-labels as objects at all, let alone as first-class objects.
Concept | Description | Languages |
---|---|---|
first-class function | closures and anonymous functions | Dart, Scheme, ML, Haskell, F#, Kotlin, Scala, Swift, PHP, Python, Raku, JavaScript, Delphi |
first-class control | continuations | Scheme, ML, F# |
first-class type | dependent types | Coq, Idris, Agda |
first-class data type | Generic Haskell. C++11 | |
first-class polymorphism | impredicative polymorphism | |
first-class message | dynamic messages (method calls) | Smalltalk,[8] Objective-C[8] |
first-class class | metaclass | Smalltalk, Objective-C, Ruby, Python, Delphi |
first-class proofs | proof object[9] | Coq, Agda |
Functions
Many programming languages support passing and returning function values, which can be applied to arguments. Whether this suffices to call function values first-class is disputed.
Some authors require it be possible to create new functions at runtime to call them 'first-class'. As a result, functions in C are not first-class objects; instead, they are sometimes called second-class objects, because they can still be manipulated in most of the above fashions (via function pointers).
In Smalltalk, functions (methods) are first-class objects, just like Smalltalk classes. Since Smalltalk operators (+, -, etc.) are methods, they are also first-class objects.
Reflection
Some languages, such as Java and PHP, have an explicit reflection subsystem which allow access to internal implementation structures even though they are not accessible or manipulable in the same way as ordinary objects.
See also
References
- Scott, Michael (2006). Programming Language Pragmatics. San Francisco, CA: Morgan Kaufmann Publishers. p. 140.
- Rod Burstall, "Christopher Strachey—Understanding Programming Languages", Higher-Order and Symbolic Computation 13:52 (2000)
- Harold Abelson and Gerald Jay Sussman, Structure and Interpretation of Computer Programs, 2nd edition, section 1.3.4 footnote 64 Archived 2015-03-09 at the Wayback Machine
- Christopher Strachey, "Fundamental Concepts in Programming Languages" in Higher-Order and Symbolic Computation 13:11 (2000); though published in 2000, these are notes from lectures Strachey delivered in August, 1967
- R. J. Popplestone: The Design Philosophy of POP-2. in: D. Michie: Machine Intelligence 3, Edinburgh at the University Press, 1968
- Finkel, R. Advanced Programming language Design, p 73
- Norman Ramsey. "About first-,second- and third-class value". stackoverflow.com. Retrieved 14 September 2013.
- Paritosh Shroff, Scott F. Smith. Type Inference for First-Class Messages with Match-Functions
- Bove, Ana; Dybjer, Peter (2009). "Dependent Types at Work" (PDF). Language Engineering and Rigorous Software Development. 5520: 57–99. doi:10.1007/978-3-642-03153-3_2. Archived (PDF) from the original on April 2, 2014. Retrieved 8 June 2015. (also archived)