Clojure, concetti fondamentali IX

c0
Naturalmente si continua sempre da qui.

Argomenti keyword

Spesso capita di dover definire funzioni con argomenti di default, oppure senza un ordine predefinito. fn (e quindi defn) lo consentono attraverso keyword arguments, coppie di keyword e valori nella chiamata e se la definizione della funzione è appropriata queste coppie vengono destrutturate e piazzate nella giusta posizione, come rest arguments. Esempio:

k0

Come si vede la funzione richiede un solo argomento: username, tutti gli altri sono copie chiave-valore, dopo la &.
Come valore di default per join-date viene definito now.

Pre- e post-condizioni
fn li consente, ma saranno trattati prossimamente.

Function literals
Sono l’equivalente dei blocchi in Ruby e lambda in Python. Tornano utili quando serve definire una funzione anonima, specie se molto semplice. Per esempio queste funzioni anonime sono equivalenti:

(fn [x y] (Math/pow x y))

#(Math/pow %1 %2)

Quest’ultima viene espansa nella precedente, come si può vedere:

k1

Ci sono differenze fra le due forme.

Form do implicito:
la form fn ha un do implicito attorno al corpo (body) della funzione, esempio:

(fn [x y]
    (println (str x \^ y))
    (Math/pow x y))

l’equivalente letterale richiede il do

#(do (println (str %1 \^ %2))
    (Math/pow %1 %2))

Arità e argomenti specificati usando simboli senza nome:
come si vede dagli esempi precedenti la fn usa i simboli x e y mentre la letterale usa simboli senza nome passati con %, il primo %1, il secondo %2 e così via. Inoltre il valore più grande definisce l’arità (numero di parametri).
Il primo argomento %1 può essere scritto semplicemente %. E si può avere un numero variabile di argomenti con &%, per cui queste sono equivalenti:

(fn [x & rest]
    (- x (apply + rest)))

#(- % (apply + %&))

Le literals function non possono essere annidate:
questa è OK:

(fn [x]
    (fn [y]
        (+ x y)))

ma questa no:

#(#(+ % %))

k2

(per fortuna!).

Pausa? OK 😉 😀

Posta un commento o usa questo indirizzo per il 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: