Clojure, concetti fondamentali VII

justin

Destrutturazione di mappe

È come la destrutturazione sequenziale; si usa con

  • hash-maps, array-maps e records (prossimamente ne parlo);
    le collezioni che implementano java.util.Map;
    ogni valore che supporta get.

Ecco un esempio elementare:

m0

Con la stessa mappa m si possono fare le seguenti operazioni

m1

notare che non è necessario che la chiave sia una keyword (quelle che iniziano con due-punti).

Gli indici in vettori, stringhe e arrays possono essere usati.

m2

Poi si possono destrutturare forme composte, esempio:

m3

dove si è usata la mappa iniziale. ma cos’è successo? La form esterna {{e :e} :d} agisce su m per liberarci del valore mappato in d; quella interna {e :e} estrae il valore mappato in e.

difatti:

m5

E si può arrivare a cose come questa:

m6

e anche

m8

Come per la sequenziale :as viene usato per conservare il riferimento alla collezione originaria:

m9

(no non ci ho capito niente, ci devo pensare su).

Con :or è possibile assegnare valori di default per quelle chiavi che non sono disponibili:

m10

questo consente di non dover fare il merging della mappa sorgente prima di destrutturarla, vale anche per il caso in cui la chiave non ci sia:

m11

Inoltre :or distingue tra valore non definito e falso (nil e false):

m12

Spesso ci sono nomi stabili per vari valori nelle mappe e è utile usare lo stesso nome all’interno del let. Fare questo però risulta ripetitivo:

m13

Dai, noioso! In questi casi si possono usare :keys, :strs e :syms per specificare chiavi di tipo keyword, stringa e simbolo nella mappa sorgente e i nomi corrispondenti ai valori possono essere collegati nella form let senza ripetizioni. Esempio (usando :keys):

m14

oppure possiamo usare :strs, così:

m15

e con :syms diventa:

m16

Come già visto in precedenza possiamo trattare valori in più come una seq “rest”. Ecco un semplice caso di un vettore che contiene qualche valore posizionale seguito da coppie chiave/valore:

m17

Il modo manuale sarebbe accettabile, questo:

m18

come si vede abbiamo destrutturato il vettore nei suoi elementi posizionale e i resto in una rest seq costruita ca coppie chiave/valore che possiamo usare come vogliamo.
Ma si può fare di meglio, sempre che il rest sua fatto da coppie chiave/valore:

m19

OK? 😉 Sì, panico 😮 (quasi).

Nota comica: se uno scrive due-punti+or ottiene questo :or. Sono dovuto ricorrere a <code>:</code>or<code></code>. 😉

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: