Clojure, concetti fondamentali VI

fakerichhickey

Destrutturazione (destructuring)

Parecchia programmazione in Clojure consiste nell’operare con strutture di dati, come le collezioni di tipo sequenziali e mappe. Diverse funzioni accettano e ritornano seq e map e parecchie librerie sono costruite per trattare queste strutture astratte invece di casi specifici. Sorge allora la necessità di accedere facilmente ai valori di queste collezioni, esempio:

d0
OK, autoevidenti first, second, last e nth. E siccome i vettori sono funzioni si può scrivere (v 2). E si può usare .get perché tutte le collezioni sequenziali implementano java.util.List.

E si possono fare cose come queste:

d1

Ci sono due tipi di destrutturazione: una per le collezioni sequenziali e una per le mappe.

Strutture sequenziali

la destrutturazione sequenziale funziona con

  • liste, vettori e seqs
  • qualsiasi collezione che implementa java.util.List, come ArrayLists e LinkedLists
  • array Java
  • stringhe, scomposte nei loro caratteri

Un esempio elementare con lo stesso vettore v di prima:

d2

qui abbiamo costruito un vettore di simboli —[x y z]— e lo abbiamo usato invece dei loro valori. Siccome viene destrutturato sequenzialmente in x c’è il primo elemento (o dovrei dire zeresimo), in y il successivo e così via.

Python ha l’unpacking che fa la stessa cosa:

d3

Notare che devo fornire anche a, difatti

d4

E con Ruby? Ecco:

d5

Tornando a noi:

d6

possiamo usare _ per i valori che non interessano, difatti:

[42 "foo" 99.2 [5 12]]
[x  _     _    [y z ]]

Ma non è finita qui: ci sono ancora due possibilità.

È possibile recuperare valori sequenziali oltre la posizione definita con l’operatore &, simile a varargs di Java.

d7

particolarmente utile in caso di ricorsività o loop. da notare che rest non è un vettore anche se la form da destrutturare lo era.

È possibile conservare il valore destrutturato specificando l’opzione :as, esempio:

d8

OK, basta con la destrutturazione delle collezioni sequenziali.
E per le mappe? Uh! saranno l’argomento del prossimo post 😉

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: