Funzione anonima↔Espressione lambda

Espressione lambda
Espressione lambda

C’è un concetto che per tanti anni mi è apparso misterioso, quello di espressione lambda o lambda expression in inglese – che poi mi è risultato analogo a quello di funzione anonima – da quando me l’hanno raccontato nel corso di Automi e Linguaggi Formali all’Università nell’ambito del corso di LISP moltissimi anni fa.

Sì, faccio pubblicamente ammenda di questa cosa, dovrei saperlo e non lo so.

Non è in ogni caso un concetto particolarmente complicato.

Espressione lambda

Una espressione lambda è una funzione senza nome (o anonima) in cui descrivo solo quali sono gli argomenti e i risultati della funzioni.

Una sintassi generale non legata ad alcun linguaggio di programmazine potrebbe essere:

argomenti -> operazioni

Per chi ha qualche confidenza con la matematica, una definizione di funzione di solito si scrive così:

\begin{gathered}
	f: \mathbb{R} \rightarrow \mathbb{R} \\
	x     \mapsto    2x 
\end{gathered}

Ecco: l’epressione nella seconda riga è esattamente la lambda expression.

Definizione di una espressione lambda in Python

Vediamo come si definiscono e si utilizzano le espressioni lambda in vari linguaggi di programmazione.

In Python le funzioni ordinarie si definiscono con la keyword def

def double(x):
  return 2*x

Quindi c’è la parola chiave def, poi il nome della funzione, l’elenco degli argomenti – tra parentesi tonde – e infine il corpo della funzione, complicato quanto si vuole.

Invece le espressioni lambda si definiscono con la keyword lambda, non è necessario dare loro un nome e occupano una sola riga:

lambda x: 2*x

quindi in generale

lambda argomenti: espressione

Poi per poterle invocare un nome bisogna comunque darglielo, ad esempio per l’espressione lambda precedente:

double = lambda x: 2*x

y = double(5)

Funzioni anonime in PHP

Le funzioni anonime in PHP sono l’equivalente delle espressioni lambda per Python:

<?php
$double = function($x) {
    return 2*$x;
}

$y = $double(5);

Ora, si potrebbe obiettare che comunque diamo sempre un nome a queste funzioni anonime, per cui: sono anonime o no?

L’uso più appropriato che da il nome di funzione anonima è la definzione di una callback, ossia una funzione che deve venire invocata quando si verifica un determinato evento.

Utilizzo in Javascript

In Javascript possiamo fare questo esempio: una funzione viene chamata quando si verifica un evento (un click, del mouse, la pressione su un link, la digitazione di un tasto della tastiera e così via). La funzione da invocare (che viene detta callback) è definita e invocata sul posto e quindi non ha alcuna necessità di avere un nome:

document.queryselector("#callback-btn")
    .addEventListener("click", function() {    
      console.log("User has clicked on the button!");
});

In questo esempio la funzione di callback viene passata alla funzione addEventListener() che ha lo scopo di agganciare l’evento “click” ad una funzione che svolge un determinato compito. In questo caso specifico, quando questo click si verifica, il programma va a scrivere una riga di log. Non c’è alcuna necessità di invocarle altrove questa funzione per cui va bene anche non darle un nome, forma a cui si perviene con la sintassi function() (senza il nome tra la keyword e le parentesi come si fa di solito).

Risorse web

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.