In computer programming
, an anonymous function (function literal, lambda abstraction, lambda function or lambda expression) is a function
definition that is not bound
to an identifier
. Anonymous functions are often arguments being passed to higher-order function
s, or used for constructing the result of a higher-order function that needs to return a function.
If the function is only used once, or a limited number of times, an anonymous function may be syntactically lighter than using a named function. Anonymous functions are ubiquitous in functional programming language
s and other languages with first-class function
s, where they fulfill the same role for the function type
do for other data type
Anonymous functions originate in the work of Alonzo Church
in his invention of the lambda calculus
, in which all functions are anonymous, in 1936, before electronic computers. In several programming languages, anonymous functions are introduced using the keyword ''lambda'', and anonymous functions are often referred to as lambdas or lambda abstractions. Anonymous functions have been a feature of programming language
s since Lisp
in 1958, and a growing number of modern programming languages support anonymous functions.
Anonymous functions can be used for containing functionality that need not be named and possibly for short-term use. Some notable examples include closures
Use of anonymous functions is a matter of style. Using them is never the only way to solve a problem; each anonymous function could instead be defined as a named function and called by name. Some programmers use anonymous functions to encapsulate specific, non-reusable code without littering the code with a lot of little one-line normal functions.
In some programming languages, anonymous functions are commonly implemented for very specific purposes such as binding events to callbacks, or instantiating the function for particular values, which may be more efficient, more readable, and less error-prone than calling a more-generic named function.
The following examples are written in Python 3.
When attempting to sort in a non-standard way, it may be easier to contain the sorting logic as an anonymous function instead of creating a named function.
Most languages provide a generic sort function that implements a sort algorithm
that will sort arbitrary objects.
This function usually accepts an arbitrary function that determines how to compare whether two elements are equal or if one is greater or less than the other.
Consider this Python code sorting a list of strings by length of the string:
>>> a = house', 'car', 'bike'>>> a.sort(key=lambda x: len(x))
car', 'bike', 'house'
The anonymous function in this example is the lambda expression:
lambda x: len(x)
The anonymous function accepts one argument,
, and returns the length of its argument, which is then used by the
method as the criteria for sorting.
Basic syntax of a lambda function in Python is
lambda arg1, arg2, arg3, ...:
The expression returned by the lambda function can be assigned to a variable and used in the code at multiple places.
>>> add = lambda a: a + a
Another example would be sorting items in a list by the name of their class (in Python, everything has a class):
>>> a = 0, 'number', 11.2>>> a.sort(key=lambda x: x.__class__.__name__)
1.2, 10, 'number'
has class name "
has class name "
has class name "
". The sorted order is "
", then "
Closures are functions evaluated in an environment containing bound variable
s. The following example binds the variable "threshold" in an anonymous function that compares the input to the threshold.
return lambda x: x < threshold
This can be used as a sort of generator of comparison functions:
>>> func_a = comp(10)
>>> func_b = comp(20)
>>> print(func_a(5), func_a(8), func_a(13), func_a(21))
True True False False
>>> print(func_b(5), func_b(8), func_b(13), func_b(21))
True True True False
It would be impractical to create a function for every possible comparison function and may be too inconvenient to keep the threshold around for further use. Regardless of the reason why a closure is used, the anonymous function is the entity that contains the functionality that does the comparing.
Currying is the process of changing a function so that rather than taking multiple inputs, it takes a single input and returns a function which accepts the second input, and so forth. In this example, a function that performs division
by any integer is transformed into one that performs division by a set integer.
>>> def divide(x, y):
... return x / y
>>> def divisor(d):
... return lambda x: divide(x, d)
>>> half = divisor(2)
>>> third = divisor(3)
>>> print(half(32), third(32))
>>> print(half(40), third(40))
While the use of anonymous functions is perhaps not common with currying, it still can be used. In the above example, the function divisor generates functions with a specified divisor. The functions half and third curry the divide function with a fixed divisor.
The divisor function also forms a closure by binding the variable
A higher-order function
is a function that takes a function as an argument. This is commonly used to customize the behavior of a generically defined function, often a looping construct or recursion scheme. Anonymous functions are a convenient way to specify such function arguments. The following examples are in Python 3.
The map function performs a function call on each element of a list. The following example square
s every element in an array with an anonymous function.
>>> a = , 2, 3, 4, 5, 6>>> list(map(lambda x: x*x, a))
, 4, 9, 16, 25, 36
The anonymous function accepts an argument and multiplies it by itself (squares it). The above form is discouraged by the creators of the language, who maintain that the form presented below has the same meaning and is more aligned with the philosophy of the language:
>>> a = , 2, 3, 4, 5, 6>>> *x for x in a, 4, 9, 16, 25, 36
The filter function returns all elements from a list that evaluate True when passed to a certain function.
>>> a = , 2, 3, 4, 5, 6>>> list(filter(lambda x: x % 2
, 4, 6
The anonymous function checks if the argument passed to it is even. The same as with map form below is considered as more appropriate:
>>> a = , 2, 3, 4, 5, 6>>> for x in a if x % 2
0, 4, 6
A fold function runs over all elements in a structure (for lists usually left-to-right, a "left fold", called
in Python), accumulating a value as it goes. This can be used to combine all elements of a structure into one value, for example:
>>> from functools import reduce
>>> a = , 2, 3, 4, 5>>> reduce(lambda x,y: x*y, a)
The anonymous function here is the multiplication of the two arguments.
The result of a fold need not be one value. Instead, both map and filter can be created using fold. In map, the value that is accumulated is a new list, containing the results of applying a function to each element of the original list. In filter, the value that is accumulated is a new list containing only those elements that match the given condition.
List of languages
The following is a list of programming language
s that support unnamed anonymous functions fully, or partly as some variant, or not at all.
This table shows some general trends. First, the languages that do not support anonymous functions (C
, Object Pascal
) are all statically typed languages. However, statically typed languages can support anonymous functions. For example, the ML
languages are statically typed and fundamentally include anonymous functions, and Delphi
, a dialect of Object Pascal
, has been extended to support anonymous functions, as has C++
(by the C++11
standard). Second, the languages that treat functions as first-class function
) generally have anonymous function support so that functions can be defined and passed around as easily as other data types.
Numerous languages support anonymous functions, or something similar.
Only some dialects support anonymous functions, either as dfn
s, in the tacit style or a combination of both.
f← ⍝ As a dfn
f 1 2 3
1 4 9
g←⊢×⊢ ⍝ As a tacit 3-train (fork)
g 1 2 3
1 4 9
h←×⍨ ⍝ As a derived tacit function
h 1 2 3
1 4 9
C (non-standard extension)
The anonymous function is not supported by standard C programming language, but supported by some C dialects, such as ''GCC'' and ''Clang''.
GNU Compiler Collection
(GCC) supports anonymous functions, mixed by nested function
s and statement expressions. It has the form:
The following example works only with GCC. Because of how macros are expanded, the
cannot contain any commas outside of parentheses; GCC treats the comma as a delimiter between macro arguments.
can be removed if
is available; in the example below using
on array would return
, which can be dereferenced for the actual value if needed.
//* this is the definition of the anonymous function */
#define lambda(l_ret_type, l_arguments, l_body) \
#define forEachInArray(fe_arrType, fe_arr, fe_fn_body) \
typedef struct __test
void printout(const testtype * array)
Clang (C, C++, Objective-C, Objective-C++)
supports anonymous functions, called blocks
, which have the form:
^return_type ( parameters )
The type of the blocks above is
Using the aforementioned ''blocks'' extension and Grand Central Dispatch
(libdispatch), the code could look simpler:
The code with blocks should be compiled with
and linked with
C++ (since C++11)
supports anonymous functions, called ''lambda expressions'', which have the form:
aptureparameters) -> return_type
This is an example lambda expression:
(int x, int y) -> int
C++11 also supports [[Closure (computer science)|closures]]. Closures are defined between square brackets
in the declaration of lambda expression. The mechanism allows these variables to be captured by value or by reference. The following table demonstrates this:
 //no variables defined. Attempting to use any external variables in the lambda is an error.
[x, &y] //x is captured by value, y is captured by reference
[&] //any external variable is implicitly captured by reference if used
//any external variable is implicitly captured by value if used
, x //x is explicitly captured by value. Other variables will be captured by reference
, &z //z is explicitly captured by reference. Other variables will be captured by value
Variables captured by value are constant by default. Adding
after the parameter list makes them non-constant.
The following two examples demonstrate use of a lambda expression:
int total = 0;
totalint x) );
This computes the total of all elements in the list. The variable
is stored as a part of the lambda function's closure. Since it is a reference to the stack variable
, it can change its value.
int total = 0;
int value = 5;
total, value, thisint x) );
This will cause
to be stored as a reference, but
will be stored as a copy.
The capture of
is special. It can only be captured by value, not by reference.
can only be captured if the closest enclosing function is a non-static member function. The lambda will have the same access as the member that created it, in terms of protected/private members.
is captured, either explicitly or implicitly, then the scope of the enclosed class members is also tested. Accessing members of
does not need explicit use of
The specific internal implementation can vary, but the expectation is that a lambda function that captures everything by reference will store the actual stack pointer of the function it is created in, rather than individual references to stack variables. However, because most lambda functions are small and local in scope, they are likely candidates for inlining
, and thus need no added storage for references.
If a closure object containing references to local variables is invoked after the innermost block scope of its creation, the behaviour is undefined
Lambda functions are function objects of an implementation-dependent type; this type's name is only available to the compiler. If the user wishes to take a lambda function as a parameter, the parameter type must be a template type, or they must create a
or a similar object to capture the lambda value. The use of the
keyword can help store the lambda function,
auto my_lambda_func = int x) ;
auto my_onheap_lambda_func = new auto(int x) );
Here is an example of storing anonymous functions in variables, vectors, and arrays; and passing them as named parameters:
double eval(std::function f, double x = 2.0)
A lambda expression with an empty capture specification (
) can be implicitly converted into a function pointer with the same type as the lambda was declared with. So this is legal:
auto a_lambda_func = (int x) ;
void (* func_ptr)(int) = a_lambda_func;
func_ptr(4); //calls the lambda.
library provides its own syntax for lambda functions as well, using the following syntax:
for_each(a.begin(), a.end(), std::cout << _1 << ' ');
, support for anonymous functions has deepened through the various versions of the language compiler. The language v3.0, released in November 2007 with .NET Framework
v3.5, has full support of anonymous functions. C# names them ''lambda expressions'', following the original version of anonymous functions, the lambda calculus
''// the first int is the x' type''
''// the second int is the return type''
Func foo = x => x * x;
While the function is anonymous, it cannot be assigned to an implicitly typed variable, because the lambda syntax may be used for denoting an anonymous function or an expression tree, and the choice cannot automatically be decided by the compiler. E.g., this does not work:
// will NOT compile!
var foo = (int x) => x * x;
However, a lambda expression can take part in type inference
and can be used as a method argument
, e.g. to use anonymous functions with the Map capability available with
// Initialize the list:
var values = new List() ;
// Map the anonymous function over all elements in the list, return the new list
var foo = values.ConvertAll(d => d * d) ;
// the result of the foo variable is of type System.Collections.Generic.List
Prior versions of C# had more limited support for anonymous functions. C# v1.0, introduced in February 2002 with the .NET Framework v1.0, provided partial anonymous function support through the use of delegates
. This construct is somewhat similar to PHP delegates. In C# 1.0, delegates are like function pointers that refer to an explicitly named method within a class. (But unlike PHP, the name is unneeded at the time the delegate is used.) C# v2.0, released in November 2005 with the .NET Framework v2.0, introduced the concept of anonymous methods as a way to write unnamed inline statement blocks that can be executed in a delegate invocation. C# 3.0 continues to support these constructs, but also supports the lambda expression construct.
This example will compile in C# 3.0, and exhibits the three forms:
public class TestDriver
In the case of the C# 2.0 version, the C# compiler takes the code block of the anonymous function and creates a static private function. Internally, the function gets a generated name, of course; this generated name is based on the name of the method in which the Delegate is declared. But the name is not exposed to application code except by using reflection
In the case of the C# 3.0 version, the same mechanism applies.
ColdFusion Markup Language (CFML)
fn = function();
CFML supports any statements within the function's definition, not simply expressions.
CFML supports recursive anonymous functions:
factorial = function(n);
CFML anonymous functions implement closure.
D uses inline delegates
to implement anonymous functions. The full syntax for an inline delegate is
If unambiguous, the return type and the keyword ''delegate'' can be omitted.
delegate (x) // if more verbosity is needed
(int x) // if parameter type cannot be inferred
delegate (int x) // ditto
delegate double(int x) // if return type must be forced manually
Since version 2.0, D
allocates closures on the heap unless the compiler can prove it is unnecessary; the
keyword can be used for forcing stack allocation.
Since version 2.058, it is possible to use shorthand notation:
x => x*x;
(int x) => x*x;
(x,y) => x*y;
(int x, int y) => x*y;
An anonymous function can be assigned to a variable and used like this:
auto sqr = (double x);
double y = sqr(4);
supports anonymous functions.
var sqr = (x) => x * x;
print(((x) => x * x)(5));
introduced anonymous functions in version 2009.
TSimpleProcedure = reference to procedure;
TSimpleFunction = reference to function(const x: string): Integer;
x1 := procedure
x1; //invoke anonymous method just defined
y1 := function(const x: string): Integer
Result := Length(x);
supports anonymous functions using lambda syntax
var n := 10000000;
var pp := Range(1,n)
uses the closure
for anonymous functions.
sum = fn(a, b) -> a + b end
square = fn(x) -> x * x end
Enum.map , 2, 3, 4 square
#=> , 4, 9, 16
uses a syntax for anonymous functions similar to that of named functions.
% Anonymous function bound to the Square variable
Square = fun(X) -> X * X end.
% Named function with the same functionality
square(X) -> X * X.
supports anonymous functions.
foo := func(x int) int
uses a concise syntax for anonymous functions (lambda expressions).
\x -> x * x
Lambda expressions are fully integrated with the type inference engine, and support all the syntax and features of "ordinary" functions (except for the use of multiple definitions for pattern-matching, since the argument list is only specified once).
map (\x -> x * x) ..5-- returns , 4, 9, 16, 25
The following are all equivalent:
f x y = x + y
f x = \y -> x + y
f = \x y -> x + y
, anonymous functions are called lambda, and use the syntax
var f = function(x) return x*x;
f(8); // 64
(function(x,y) return x+y)(5,6); // 11
supports anonymous functions, named ''Lambda Expressions'', starting with JDK 8
A lambda expression consists of a comma separated list of the formal parameters enclosed in parentheses, an arrow token (->), and a body. Data types of the parameters can always be omitted, as can the parentheses if there is only one parameter. The body can consist of one statement or a statement block.
// with no parameter
() -> System.out.println("Hello, world.")
// with one parameter (this example is an identity function).
a -> a
// with one expression
(a, b) -> a + b
// with explicit type information
(long id, String name) -> "id: " + id + ", name:" + name
// with a code block
(a, b) ->
// with multiple statements in the lambda body. It needs a code block.
// This example also includes two nested lambda expressions (the first one is also a closure).
(id, defaultPrice) ->
Lambda expressions are converted to "functional interfaces" (defined as interfaces that contain only one abstract method in addition to one or more default or static methods),
[''The Java Tutorials: Lambda Expressions''](_blank)
as in the following example:
public class Calculator
In this example, a functional interface called
is declared. Lambda expressions that implement
are passed to the
method to be executed. Default methods like
define methods on functions.
Java 8 introduced another mechanism named method reference (the
operator) to create a lambda on an existing method. A method reference doesn't indicate the number or types of arguments because those are extracted from the abstract method of the functional interface.
IntBinaryOperator sum = Integer::sum;
In the example above, the functional interface
declares an abstract method
int applyAsInt(int, int)
, so the compiler looks for a method
int sum(int, int)
in the class
Java 8 lambdas have the following limitations:
* Lambdas can throw checked exceptions, but such lambdas will not work with the interfaces used by the Collection API.
* Variables that are in-scope where the lambda is declared may only be accessed inside the lambda if they are effectively final, i.e. if the variable is not mutated inside or outside of the lambda scope.
supports anonymous functions.
supports "arrow function" syntax, where a => symbol separates the anonymous function's parameter list from the body:
alert((x => x * x)(10));
This construct is often used in Bookmarklet
s. For example, to change the title of the current document (visible in its window's title bar
) to its URL
, the following bookmarklet may seem to work.
However, as the assignment statement returns a value (the URL itself), many browsers actually create a new page to display this value.
Instead, an anonymous function, that does not return a value, can be used:
The function statement in the first (outer) pair of parentheses declares an anonymous function, which is then executed when used with the last pair of parentheses. This is almost equivalent to the following, which populates the environment with
unlike an anonymous function.
to avoid new pages for arbitrary anonymous functions:
, the form of the constructs are
a parenthetical within a parenthetical
and a parenthetical applied to a parenthetical
(comma) operator in the context of a parenthetical expression. It is no mere coincidence that the syntactic forms coincide for an expression and a function's arguments (ignoring the function formal parameter syntax)! If
is not identified in the constructs above, they become
's could be (,,42,"abc",function()) as long as the expression evaluates to a function.)
Also, a function is an Object instance (likewise objects are Function instances) and the object literal notation brackets,
for braced code, are used when defining a function this way (as opposed to using
, can be considered to be a fixed point
More correctly but with caveats,
( function()() ) ~=
's is generally not legal
does not "forget"
to analyze the space
and time complexities
implement easily with these last anonymous function constructs. From the implications of the results, it is possible to deduce some of an engine's recursive versus iterative implementation details, especially tail-recursion
anonymous functions are defined using the syntax
julia> f = x -> x*x; f(8)
support anonymous functions using the "lambda" construct, which is a reference to lambda calculus
supports anonymous functions with the "fn" special form and #() reader syntax.
(lambda (arg) (* arg arg))
has the concept of lambda expressions. A lambda expression is written as a list with the symbol "lambda" as its first element. The list then contains the argument list, documentation or declarations and a function body. Lambda expressions can be used inside lambda forms and with the special operator "function".
(function (lambda (arg) (do-something arg)))
"function" can be abbreviated as #'. Also, macro ''lambda'' exists, which expands into a function form:
; using sharp quote
#'(lambda (arg) (do-something arg))
; using the lambda macro:
(lambda (arg) (do-something arg))
One typical use of anonymous functions in Common Lisp is to pass them to higher-order functions like ''mapcar'', which applies a function to each element of a list and returns a list of the results.
(mapcar #'(lambda (x) (* x x))
'(1 2 3 4))
; -> (1 4 9 16)
The ''lambda form'' in Common Lisp allows a ''lambda expression'' to be written in a function call:
((lambda (x y)
(+ (sqrt x) (sqrt y)))
Anonymous functions in Common Lisp can also later be given global names:
(setf (symbol-function 'sqr)
(lambda (x) (* x x)))
; which allows us to call it using the name SQR:
''named functions'' is simply syntactic sugar
for anonymous functions bound to names:
(define (somename arg)
expands (and is equivalent) to
supports anonymous functions through the "fn" special form:
(fn (+ x 3))
There is also a reader syntax to define a lambda:
# (+ % %2%3) ; Defines an anonymous function that takes three arguments and sums them.
Like Scheme, Clojure's "named functions" are simply syntactic sugar for lambdas bound to names:
(defn func rg(+ 3 arg))
(def func (fn rg(+ 3 arg)))
(much as in Scheme) all functions are anonymous. A ''named function'' in Lua is simply a variable holding a reference to a function object.
Thus, in Lua
function foo(x) return 2*x end
is just syntactical sugar for
foo = function(x) return 2*x end
An example of using anonymous functions for reverse-order sorting:
return a.name > b.name
Wolfram Language, Mathematica
The Wolfram Language
is the programming language of Mathematica
. Anonymous functions are important in programming the latter. There are several ways to create them. Below are a few anonymous functions that increment a number. The first is the most common.
refers to the first argument and
marks the end of the anonymous function.
Function,x+1 x \unctionx+1
So, for instance:
f:= #1^2&;f 64
Also, Mathematica has an added construct to make recursive anonymous functions. The symbol '#0' refers to the entire function. The following function calculates the factorial of its input:
1, 1, #1 * #0[#1-1&
For example, 6 factorial would be:
1, 1, #1 * #0[#1-1]]&
Anonymous functions in [[MATLAB]] or [[GNU Octave|Octave]] are defined using the syntax
. Any variables that are not found in the argument list are inherited from the enclosing scope.
>> f = @(x)x*x; f(8)
ans = 64
>> (@(x,y)x+y)(5,6) % Only works in Octave
ans = 11
anonymous functions are defined using the syntax
f: lambda(x*x); f(8);
The various dialects of ML
support anonymous functions.
Anonymous functions in OCaml are functions without a declared name. Here is an example of an anonymous function that multiplies its input by two:
fun x -> x*2
In the example, fun is a keyword indicating that the function is an anonymous function. We are passing in an argument x and -> to separate the argument from the body.
supports anonymous functions,
(fun x -> x * x) 20 // 400
supports anonymous functions, as follows:
fn arg => arg * arg
Next Generation Shell
Next Generation Shell
has several syntaxes for anonymous functions due to their prevalence in the language and different use cases.
f = X*X; f(8) # Result: 64
f = ; f(2,3,4) # Result: 10
f = F(x:Int, y:Int) x*y+2; f(3, 4) # Result: 14
f = "$ is all about $"
f("programming", "semantics") # Result: "programming is all about semantics"
Anonymous functions usage examples:
,1,2map(X*2) # Result: ,2,4
data.map("$ is $") # Result: a is xxx", "b is yyy"
supports multi-line multi-expression anonymous functions.
var anon = proc (var1, var2: int): int = var1 + var2
assert anon(1, 2)
var anon = func (x: int): bool =
if x > 0:
result = true
result = false
Anonymous functions may be passed as input parameters of other functions:
var cities = @Frankfurt", "Tokyo", "New York"
proc (x, y: string): int = cmp(x.len, y.len)
An anonymous function is basically a function without a name.
supports anonymous functions,
(sub )->(); # 1. fully anonymous, called as created
my $squarer = sub ; # 2. assigned to a variable
# example of currying in Perl programming
sub sum # returns the sum of its arguments
my $curried = curry \&sum, 5, 7, 9;
print $curried->(1,2,3), "\n"; # prints 27 ( = 5 + 7 + 9 + 1 + 2 + 3 )
Other constructs take ''bare blocks'' as arguments, which serve a function similar to lambda functions of one parameter, but don't have the same parameter-passing convention as functions -- @_ is not set.
my @squares = map 1..10; # map and grep don't use the 'sub' keyword
my @square2 = map $_ * $_, 1..10; # braces unneeded for one expression
my @bad_example = map 1..10; # values not passed like normal Perl function
Before 4.0.1, PHP
had no anonymous function support.
PHP 4.0.1 to 5.3
PHP 4.0.1 introduced the
which was the initial anonymous function support. This function call makes a new randomly named function and returns its name (as a string)
$foo = create_function('$x', 'return $x*$x;');
$bar = create_function("\$x", "return \$x*\$x;");
The argument list and function body must be in single quotes, or the dollar signs must be escaped.
Otherwise, PHP assumes "
" means the variable
and will substitute it into the string (despite possibly not existing) instead of leaving "
" in the string.
For functions with quotes or functions with many variables, it can get quite tedious to ensure the intended function body is what PHP interprets.
Each invocation of
makes a new function, which exists for the rest of the program, and cannot be ''garbage collected
'', using memory in the program irreversibly. If this is used to create anonymous functions many times, e.g., in a loop, it can cause problems such as memory bloat.
PHP 5.3 added a new class called
and magic method
that makes a class instance invocable.
$x = 3;
$func = function($z) ;
echo $func($x); // prints 6
In this example,
is an instance of
is equivalent to
PHP 5.3 mimics anonymous functions but it does not support true anonymous functions because PHP functions are still not first-class objects.
PHP 5.3 does support closures but the variables must be explicitly indicated as such:
$x = 3;
$func = function() use(&$x) ;
echo $x; // prints 6
is bound by reference so the invocation of
modifies it and the changes are visible outside of the function.
Arrow functions were introduced in PHP 7.4
$x = 3;
$func = fn($z) => $z * 2;
echo $func($x); // prints 6
uses the following syntax for anonymous predicates (lambda expressions):
/ambdaParameter1, LambdaParameter2, ...>Goal
A simple example with no free variables and using a list mapping predicate is:
| ?- meta::map(,Y>(Y is 2*X), ,2,3 Ys).
Ys = ,4,6yes
Currying is also supported. The above example can be written as:
| ?- meta::map(>(>(Y is 2*X)), ,2,3 Ys).
Ys = ,4,6yes
Anonymous functions (in general anonymous ''predicates'') were introduced in Visual Prolog
in version 7.2. Anonymous predicates can capture values from the context. If created in an object member, it can also access the object state (by capturing
returns an anonymous function, which has captured the argument
in the closure. The returned function is a function that adds
to its argument:
mkAdder(X) = .
supports simple anonymous functions through the lambda form.
The executable body of the lambda must be an expression and can't be a statement, which is a restriction that limits its utility. The value returned by the lambda is the value of the contained expression. Lambda forms can be used anywhere ordinary functions can. However these restrictions make it a very limited version of a normal function. Here is an example:
>>> foo = lambda x: x * x
In general, Python convention encourages the use of named functions defined in the same scope as one might typically use an anonymous functions in other languages. This is acceptable as locally defined functions implement the full power of closure
s and are almost as efficient as the use of a lambda in Python. In this example, the built-in power function can be said to have been curried
>>> def make_pow(n):
... def fixed_exponent_pow(x):
... return pow(x, n)
... return fixed_exponent_pow
>>> sqr = make_pow(2)
>>> cub = make_pow(3)
In R the anonymous functions are defined using the syntax
> f <- function(x)x*x; f(8)
, all blocks (even those associated with if, while, etc.) are anonymous functions. A block that is not used as an rvalue
is executed immediately.
# fully anonymous, called as created
# assigned to a variable
my $squarer1 = -> $x ; # 2a. pointy block
my $squarer2 = ; # 2b. twigil
my $squarer3 = ; # 2c. Perl 5 style
sub add ($m, $n)
my $seven = add(3, 4);
my $add_one = &add.assuming(m => 1);
my $eight = $add_one($seven);
# WhateverCode object
my $w = * - 1; # WhateverCode object
my $b = ; # same functionality, but as Callable block
Ruby supports anonymous functions by using a syntactical structure called ''block''. There are two data types for blocks in Ruby.
s behave similarly to closures
s behave more analogous to an anonymous function. When passed to a method, a block is converted into a Proc in some circumstances.
irb(main):001:0> # Example 1:
irb(main):002:0* # Purely anonymous functions using blocks.
irb(main):003:0* ex = 6.2, 24.1, 48.3, 32.4, 8.5=> 6.2, 24.1, 48.3, 32.4, 8.5irb(main):004:0> ex.sort_by # Sort by fractional part, ignoring integer part.
=> 4.1, 16.2, 48.3, 32.4, 8.5irb(main):005:0> # Example 2:
irb(main):006:0* # First-class functions as an explicit object of Proc -
irb(main):007:0* ex = Proc.new
irb(main):009:0> # Example 3:
irb(main):010:0* # Function that returns lambda function object with parameters
irb(main):011:0* def is_multiple_of(n)
irb(main):014:0> multiple_four = is_multiple_of(4)
irb(main):016:0> multiple_four5=> false
, anonymous functions are called closures. They are defined using the following syntax:
|: | -> ;
let f = |x: i32| -> i32 ;
With type inference, however, the compiler is able to infer the type of each parameter and the return type, so the above form can be written as:
let f = |x| ;
With closures with a single expression (i.e. a body with one line), the curly braces may be omitted:
let f = |x| x * 2;
Closures with no input parameter are written like so:
let f = || println!("Hello, world!");
Closures may be passed as input parameters of functions that expect a function pointer:
// A function which takes a function pointer as an argument and calls it with
// the value `5`.
fn apply(f: fn(i32) -> i32) -> i32
However, one may need complex rules to describe how values in the body of the closure are captured. They are implemented using the
: the closure captures by reference (
). They are used for functions that can still be called if they only have reference access (with
) to their environment.
: the closure captures by mutable reference (
). They are used for functions that can be called if they have mutable reference access (with
) to their environment.
: the closure captures by value (
). They are used for functions that are only called once.
With these traits, the compiler will capture variables in the least restrictive manner possible. They help govern how values are moved around between scopes, which is largely important since Rust follows a lifetime construct to ensure values are "borrowed" and moved in a predictable and explicit manner.
The following demonstrates how one may pass a closure as an input parameter using the
// A function that takes a value of type F (which is defined as
// a generic type that implements the `Fn` trait, e.g. a closure)
// and calls it with the value `5`.
fn apply_by_ref(f: F) -> i32
where F: Fn(i32) -> i32
// ~~ Program output ~~
// I got the value: 5
// 5 * 2 = 10
, anonymous functions use the following syntax:
(x: Int, y: Int) => x + y
In certain contexts, like when an anonymous function is a parameter being passed to another function, the compiler can infer the types of the parameters of the anonymous function and they can be omitted in the syntax. In such contexts, it is also possible to use a shorthand for anonymous functions using the underscore character to introduce unnamed parameters.
val list = List(1, 2, 3, 4)
list.reduceLeft( (x, y) => x + y )
// Here, the compiler can infer that the types of x and y are both Int.
// Thus, it needs no type annotations on the parameters of the anonymous function.
list.reduceLeft( _ + _ )
// Each underscore stands for a new unnamed parameter in the anonymous function.
// This results in an even shorter equivalent to the anonymous function above.
anonymous functions are called blocks
and they are invoked (called) by sending them a "value" message. If arguments are to be passed, a "value:...value:" message with a corresponding number of value arguments must be used.
x*x value: 4
Smalltalk blocks are technically closures, allowing them to outlive their defining scope and still refer to the variables declared therein.
a + n
"returns the inner block, which adds 10 to its argument."
, anonymous functions are called closures. The syntax has following form:
For sake of brevity and expressiveness, the parameter types and return type can be omitted if these can be inferred:
Similarly, Swift also supports implicit return statements for one-statement closures:
Finally, the parameter names can be omitted as well; when omitted, the parameters are referenced using shorthand argument names, consisting of the $ symbol followed by their position (e.g. $0, $1, $2, etc.):
, applying the anonymous squaring function to 2 looks as follows:''apply manual page''
# returns 4
This example involves two candidates for what it means to be a ''function'' in Tcl. The most generic is usually called a ''command prefix'', and if the variable ''f'' holds such a function, then the way to perform the function application ''f''(''x'') would be
is the expansion prefix (new in Tcl 8.5). The command prefix in the above example is
Command names can be bound to command prefixes by means of the
interp alias command. Command prefixes support currying. Command prefixes are very common in Tcl APIs.
The other candidate for "function" in Tcl is usually called a ''lambda'', and appears as the
part of the above example. This is the part which caches the compiled form of the anonymous function, but it can only be invoked by being passed to the
apply command. Lambdas do not support currying, unless paired with an
apply to form a command prefix. Lambdas are rare in Tcl APIs.
Visual Basic .NET
Visual Basic .NET 2008 introduced anonymous functions through the lambda form. Combined with implicit typing, VB provides an economical syntax for anonymous functions. As with Python, in VB.NET, anonymous functions must be defined on one line; they cannot be compound statements. Further, an anonymous function in VB.NET must truly be a VB.NET
Function - it must return a value.
Dim foo = Function(x) x * x
Visual Basic.NET 2010 added support for multiline lambda expressions and anonymous functions without a return value. For example, a function for use in a Thread.
Dim t As New System.Threading.Thread(Sub ()
For n As Integer = 0 To 10 'Count to 10
Console.WriteLine(n) 'Print each number
* First-class function
Anonymous Methods - When Should They Be Used?
(blog about anonymous function in Delphi)
Compiling Lambda Expressions: Scala vs. Java 8
php anonymous functions
php anonymous functions
Lambda functions in various programming languages
Category:Articles with example code