Кажется, в наши дни довольно много основных языков поддержки function literals. Их также называют anonymous functions, но мне все равно, есть ли у них имя. Важно то, что литерал функции является выражением, которое дает функцию, которая еще не определена в другом месте, поэтому, например, в C, &printf
не учитывается.Какие языки поддерживают * рекурсивные * функции литералов/анонимные функции?
EDIT, чтобы добавить: если у вас есть истинное функциональное выражение <exp>
, вы должны передать его функции f(<exp>)
или сразу применить ее к аргументу, т.е. <exp>(5)
.
Мне любопытно, какие языки позволяют писать функциональные литералы, которые являются рекурсивными. Статья в Википедии «anonymous recursion» не содержит примеров программирования.
В качестве примера воспользуемся рекурсивной факторной функцией.
Вот те, которые я знаю:
JavaScript/ECMAScript может сделать это с
callee
:function(n){if (n<2) {return 1;} else {return n * arguments.callee(n-1);}}
легко в языках с
letrec
, например, Haskell (который называет егоlet
) :let fac x = if x<2 then 1 else fac (x-1) * x in fac
и есть эквиваленты в Lisp и Scheme. Обратите внимание, что привязка
fac
является локальной для выражения, поэтому все выражение на самом деле является анонимной функцией.
Есть ли другие?
анонимных функции отличаются от динамических функций, разница в объеме, анонимная функция или «функции буквальных» является истинным объектом так же, как целое число 3. так, например, РНР до 5.3 имели динамические функции, bu t не анонимный. (См. Сообщение ниже) – Zorf 2010-05-20 14:55:42