Funzione anonima
# Funzione anonima

In programmazione informatica, una funzione anonima o funzione lambda è una funzione definita, e possibilmente chiamata, senza essere legata ad un identificatore. Le funzioni anonime sono utili per passare come argomento una funzione di ordine superiore e si trovano in linguaggi che supportano funzioni di prima classe, come ad esempio Haskell.

Le funzioni anonime sono una forma di funzione nidificata, che consente l'accesso alle variabili nella portata della funzione contenitrice (variabili non locali). Benché siano nominate come funzioni annidate, non possono essere ricorsive senza l'aiuto di un operatore fixed-point combinator (funzione di ordine superiore) che in questo caso viene chiamato fixpoint anonimo o ricorsione anonima.

Queste funzioni anonime nascono dal lavoro di Alonzo Church sul Lambda calcolo del 1936. In molti linguaggi di programmazione le funzioni anonime sono introdotte con la parola chiave lambda ed è per questo che ci si riferisce ad esse come funzioni lambda.

Già nel 1958, Lisp aveva funzioni anonime. Oggi si trovano in molti altri linguaggi, come Scala, JavaScript, Ruby, Python, PHP, C++, Perl, Visual Basic, Delphi, Java, ecc., sebbene alcuni di questi non siano nati come veri e propri linguaggi funzionali.

## Supporto nei vari linguaggi

### Python

Python supporta funzioni anonime semplici attraverso la forma lambda. Il corpo d'esecuzione della lambda deve essere una espressione e non una dichiarazione, e quindi questa è una restrizione alla sua utilità. Il valore restituito dalla lambda è il valore contenuto nell'espressione.

### VB.NET

In Visual Basic.NET è possibile creare funzioni anonime o lambda usando le parole chiave Sub o Function nello stesso modo in cui si crea una normale subroutine o una funzione. Le espressioni lambda sono racchiuse in una istruzione (che però può avere più righe). È possibile creare espressioni lambda che utilizzano elaborazione asincrona usando gli operatori Async e Await.

### Ruby

Ruby supporta le funzioni anonime usando una struttura sintattica chiamata block. Quando è passata a un metodo, un blocco è convertito in un oggetto di classe Proc in alcune circostanze.

### JavaScript

Le funzioni anonime, in JavaScript, si definiscono come le funzioni non anonime. Per esempio, la funzione

in forma anonima si scrive

e può essere assegnata a una variabile

oppure passata come parametro a un'altra funzione.

Dalla versione ES6 si può usare una sintassi alternativa più snella:

oppure, in modo ancora più sintetico

JavaScript supporta le funzioni anonime autoinvocanti, cioè che vengono invocate al momento stesso della dichiarazione. Questa modalità è ampiamente sfruttata in librerie runtime quali JQuery.

Oppure, da ES6 in poi:

### TypeScript

Specificando i tipi (che in TypeScript sono opzionali):

### C++

C++ aggiunge il supporto alle funzioni anonime a partire dalla versione 11 dello standard.

Nell'esempio precedente la variabile add è di tipo std::function<int(int, int)>, ovvero: std::function<tipo_restutuito(tipi_dei_parametri)>. Tuttavia da C++11 in poi è possibile omettere il tipo formale (per l'appunto std::function<int(int, int)>) utilizzando la parola chiave auto se il tipo è deducibile al momento della compilazione (come in questo caso).

**Cattura delle variabili**

In altri linguaggi (come JavaScript, per esempio) le funzioni lambda possono catturare tutte le variabili nel loro ambito di visibilità, più semplicemente, si può dire che una lambda ha accesso a tutte le variabili dichiarate prima della lambda stessa. In C++ è possibile specificare a quali variabili ha accesso la funzione lambda. Si può anche specificare se le variabili siano accessibili per valore o per riferimento (by value o by reference); le variabili passate per valore sono utilizzabili in modalità di sola lettura (read only).

L'output del compilatore è il seguente:

Per correggere l'errore:

L'output del programma è il seguente: Prima della modifica a=0 b=0 Dopo la modifica a=1 b=2 Si può catturare le variabili con le seguenti modalità:

**Funzioni anonime autoinvocanti**

C++ (come altri linguaggi, per esempio JavaScript) permette di dichiarare funzioni anonime autoinvocanti, cioè che vengono invocate al momento della dichiarazione:

### Java

In Java le funzioni anonime sono state inserite nella versione 8 (rilasciata nel 2014) e sono specificabili secondo la seguente sintassi:

Per esempio, il seguente codice:

è l'equivalente funzionale di:

