Язык, который считает процедуры «первоклассными» , позволяет передавать функции так же, как и любое другое значение .
Языки, такие как Java 7 (и ранее) и «своего рода» C имеют такую возможность: C позволяет передавать указатели на функции, но вы не можете динамически определять функцию в этих языках и внезапно передавать ее в другое место.Java до версии 8 может имитировать в определенной степени это с анонимными классами, но технически не имеет функций первого класса.
С другой стороны, C ++, D, C #,Visual Basic .NET, Java 8+ и функциональные языки (такие как Scheme и Haskell) do позволяют передавать функции как переменные.Например, приведенный ниже код возвращает функцию, которая добавляет addend
к своему входу:
Написано на D:
int delegate(int) makeAdder(int addend) //Returns a function
{
return delegate int(int x) //Long way
{
return x + addend; //Notice that addend came from _outside_ the function
};
return (int x) { return x + addend; }; //Short way
return x => addend + x; //Super-short way, introduced in D 2.058
}
Написано на C #:
Func<int, int> MakeAdder(int addend) //Returns a function
{
return delegate(int x) //The long way. Note: Return type is implicitly 'int'
{
return x + addend;
};
return x => x + addend; //Short way: x "goes to" (x + addend); inferred types
}
Написано на C ++:
#include <functional>
std::function<int(int)> make_adder(int addend)
{
return [=](int x)
{
return addend + x;
};
}
Написано на Scala:
def makeAdder(addend: Int) = (x: Int) => addend + x
Написано на Python:
def make_adder(addend):
def f(x):
return addend + x
return f
# or...
return lambda x: addend + x
Написано на Erlang:
make_adder(Addend) ->
fun(X) -> Addend + X end.
Написано на JavaScript:
function makeAdder(addend) {
return function(x) {
return addend + x;
};
}
Написано на JavaScript (синтаксис функции стрелки ES2015):
const makeAdder = addend => x => addend + x;
Написано на схеме:
(define (makeAdder addend)
(lambda (x)
(+ x addend)))
Написано на Haskell:
makeAdder :: Int -> (Int -> Int)
makeAdder addend = \x -> addend + x
Написано на Visual Basic 2008:
Function MakeAdder(addend As Integer) As Func(Of Integer, Integer)
Return Function(x) (x + addend)
End Function
Написано на Swift (как подробные, так и краткие реализации):
func makeAdder(append: Int) -> (x: Int) -> Int {
return { (x: Int) -> Int in
return x + append
};
}
func makeAdder(append: Int) -> (Int) -> Int {
return {$0 + append};
}
(Кстати, «лямбда» - это просто функция без имени. Лямбды поддерживаются только в языках, которые поддерживают первоклассные функции.)