Функции первого класса: различия между версиями

[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Нет описания правки
Нет описания правки
Строка 3:
<ref name="test">[http://www.worldcat.org/oclc/222529448 Programming language pragmatics], by Michael Lee Scott, section 11.2 "Functional Programming".</ref>
В языках с функциями первого класса имена функций не имеют никакого специального статуса, они рассматриваются как обычные переменные [[eng:Function type|типа функции]].<ref>{{cite journal |title=The Implementation of Lua 5.0 |author1=Roberto Ierusalimschy |author2=Luiz Henrique de Figueiredo |author3=Waldemar Celes |url=http://www.lua.org/doc/jucs05.pdf}}</ref>
Термин был впервые использован [[:en:Christopher Strachey|Кристофером Строчи]] в контексте «функции как объекты первого класса» в середине 1960-х. <ref name="strachey">Rod Burstall, "Christopher Strachey—Understanding Programming Languages", ''[[Higher-Order and Symbolic Computation]]'' '''13''':52 (2000)</ref>
 
Функции первого класса являются неотъемлемой частью [[Функциональное программирование|функционального программирования]], в котором использование [[Функции высшего порядка|функций высшего порядка]] является стандартной практикой. Простым примером функции высшего порядка будет функция ''[[Map]]'', которая принимает в качестве своих аргументов функцию и список и возвращается список, после применения функции к каждому элементу списке. Чтобы язык программирования поддерживал [[Map]], он должен поддерживать передачу функций как аргумента.
 
Существуют некоторые сложности в реализации передачи функций как аргументов и возвращении их как результата, особенно в присутствии [[eng:en:non-local variable|нелокальных перемененных]], введенных в [[eng:en:Nested function|вложенных]] и [[Анонимная функция|анонимных функциях]]. Исторически они были названы [[Проблема фунарга|проблемами фунарга]], от английского "function argument".<ref>[[Joel Moses]]. [https://dspace.mit.edu/handle/1721.1/5854 "The Function of FUNCTION in LISP, or Why the FUNARG Problem Should be Called the Environment Problem"]. MIT AI Memo 199, 1970.</ref>
В ранних императивных языках программирования эти проблемы обходились путем отказа от поддержки возвращения функций как результата или отказа от вложенных функций и следовательно нелокальных переменных(в частности [[Си_(язык_программирования)|C]]). [[Lisp]], один из первых функциональных языков программирования применяет подход [[eng:en:dynamic scoping|динамической области видимости]], где нелокальные переменные возвращают ближайшее определение этих переменных к точке, в которой функция была вызвана, вместо точки, в которой она была объявлена. Полноценная поддержка для [[eng:en:lexical scoping|лексического контекста]] функций первого порядка была введена в [[Scheme]] и предполагает обработку ссылок на функции как [[Замыкание|замыканий]] вместо чистых [[en:Function pointer|указателей на функции]]<ref name="strachey"/>, что, в свою очередь, делает необходимым применение [[Сборка_мусора|сборки мусора]].
 
==Концепции==