Clojure, concetti fondamentali VIII

rich-hickey-function

Creare funzioni: fn

Le funzioni sono valori first-class creati dalla special form fn che racchiude anche let e do.

Ecco un esempio, una funzione che aggiunge 10 all’argomento passatole

(fn [x]
  (+ 10 x))

Notare che gli argomenti vengono passati in un vettore. Tutto quello che segue è il corpo della funzione, c’è un do implicito. L’ultima form eseguita è il valore ritornato dalla funzione.

La valutazione degli argomenti:

f0

8 in questo caso è il solo argomento e viene collegato a x; è equivalente a questa form:

f1

Si possono avere più argomenti:

f2

equivalente a:

f3

Si possono creare anche funzioni con multiple arities (numero di parametri). In questo caso si mette la funzione in un var per poterla chiamare per nome:

f4

In questo caso ogni arity dev’essere racchiusa tra una coppia di parentesi, la form giusta viene scelta in base al numero di parametri passato.

defn

defn è una macro che incapsula def e fn in modo da poterla definire con nome in forma concisa. Per esempio le due definizioni seguenti sono equivalenti:

(def strange-adder (fn adder-self-reference
                     ([x] (adder-self-reference x 1))
                     ([x y] (+ x y))))

equivalente a:

(defn strange-adder
    ([x] (strange-adder x 1))
    ([x y] (+ x y)))

f6

Per le funzioni con una sola arity non serve la  coppia di parentesi addizionali, per cui si ha:

(def redundant-adder (fn redundant-adder
                       [x y z]
                       (+ x y z)))

e

(defn redundant-adder
    [x y z]
    (+ x y z))

L’uso di defn semplifica il codice in qundo non è necessario continuare a ridefinire ogni volta la funzione.

Destrutturazione degli argomenti

Usando let si può destrutturare gli argomenti usati dalla funzione. Ci sono diversi casi, eccone un paio.

Funzioni variadic
Sono le funzioni con variabili opzionali, così le chiama Java. In questo caso si una una seq, esempio:

f9

Si può usare anche per gestire la zero-arity (no args), esempio (mio, vediamo se mi riesce di modificare il precedente):

f10

Uh! ancora troppe cose; pausa 😉

Posta un commento o usa questo indirizzo per il trackback.

Trackback

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

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

%d blogger hanno fatto clic su Mi Piace per questo: