--- layout: post status: publish published: true title: Fun with guards author: display_name: Siv login: admin email: alessandro.sivieri@gmail.com url: https://launchpad.net/~scattino author_login: admin author_email: alessandro.sivieri@gmail.com author_url: https://launchpad.net/~scattino excerpt: 'Un breve post per introdurre una caratteristica di Erlang che non viene spiegata in modo così chiaro: le guards per le funzioni lambda (o fun nel linguaggio in questione). Ordunque: anche Erlang ha la possibilità di filtrare gli input di una funzione utilizzando alcune funzioni predefinite; questo permette di evitare l’uso di condizionali, che peraltro [...]' wordpress_id: 828 wordpress_url: http://www.chimera-bellerofonte.eu/?p=1271 date: '2011-02-05 13:12:09 +0000' date_gmt: '2011-02-05 12:12:09 +0000' categories: - PlanetPOuL tags: [] comments: [] ---

Un breve post per introdurre una caratteristica di Erlang che non viene spiegata in modo così chiaro: le guards per le funzioni lambda (o fun nel linguaggio in questione).

Ordunque: anche Erlang ha la possibilità di filtrare gli input di una funzione utilizzando alcune funzioni predefinite; questo permette di evitare l’uso di condizionali, che peraltro non sono il massimo dell’usabilità in un linguaggio del genere.

Qualunque manuale vi mostrerà, ad esempio, un listato come il seguente:

abs(Number) when Number < 0 ->
    -Number;
abs(Number) ->
    Number.

Questo è un banale esempio di una funzione che calcola il valore assoluto di un numero: quando questo è minore di zero, viene ritornato il suo opposto, in caso contrario viene ritornato il numero stesso.

E fin qui, tutto bene. La questione è: è possibile filtrare anche nelle lambda allo stesso modo? E la risposta è sì, anche se la sintassi non è proprio chiarissima e soprattutto non è segnata nei manuali; ad esempio, riprendendo l’esempio di prima:

abs(List) when is_list(List) ->
    lists:map(fun(Element) when Element < 0 ->
                     -Element;
                 (Element) ->
                     Element end, List).

In questo caso, il filtraggio avviene esattamente come prima, in una funzione che prende in input una lista di numeri e ne restituisce una versione con i valori assoluti di ciascun valore. Da notare la sintassi per applicare le guards nella lambda interna alla map: bisogna ripetere i parametri della funzione, parentesi comprese, ma senza ripetere la dichiarazione fun.

E’ una caratteristica che cercavo da tempo, ed ora finalmente ho scoperto come si applica…