Liste di associazione (Alists)
Una lista di associazioni (o alist) è una struttura dati fondamentale in Scheme utilizzata per rappresentare raccolte di coppie chiave-valore. È implementato come un elenco di coppie, in cui ciascuna coppia associa una chiave (tipicamente un simbolo) a un valore. Gli elenchi sono semplici, flessibili e adatti a set di dati di piccole e medie dimensioni.
Struttura di una lista di associazioni
Una alist è una lista in cui ogni elemento è una coppia (costruita con cons). Ogni coppia è composta da:
- Chiave: il primo elemento (tipicamente un simbolo).
- Valore: il secondo elemento, che può essere di qualsiasi tipo di dati.
(define alist '((name . "Alice") (age . 30) (city . "Paris")))- Chiave:
'name,'age,'city - Valore:
"Alice",30,"Paris" - Struttura: un elenco di coppie:
((name . "Alice") (age . 30) (city . "Paris"))
Creazione di un elenco
È possibile creare un elenco costruendo manualmente coppie o costruendolo a livello di codice utilizzando cons.
Utilizzo della virgoletta singola (')
La virgoletta singola (') è una scorciatoia per quoting, che impedisce a Scheme di valutare l’espressione. Ciò lo rende ideale per creare elenchi statici in cui tutte le chiavi e i valori sono codificati.
;; Definire manualmente un alist
(define alist '((name . "Alice") (age . 30) (city . "Paris")))
;; Aggiungere programmaticamente una nuova coppia
(define updated-alist (cons '(country . "France") alist))Risultato:
((country . "France") (name . "Alice") (age . 30) (city . "Paris"))
Utilizzo delle virgolette inverse (`) e virgola (,)
L’operatore virgolette inverse (`) è simile al singolo apice, ma consente di inserire dinamicamente espressioni valutate con la virgola (,). Ciò è utile per creare elenchi in cui chiavi o valori vengono calcolati in fase di esecuzione.
(define key 'name)
(define value "Alice")
(define alist `((,key . ,value) (age . 30) (city . "Paris")))Risultato:
((name . "Alice") (age . 30) (city . "Paris"))
Esempio di confronto
Elenco statico utilizzando ':
(define alist '((name . "Alice") (age . 30) (city . "Paris")))Elenco dinamico utilizzando ` e ,:
(define key 'name)
(define value "Alice")
(define alist `((,key . ,value) (age . 30) (city . "Paris")))Accesso ai dati in un elenco
Per recuperare un valore da un elenco, è possibile utilizzare la funzione assoc, che cerca una coppia in base alla sua chiave.
(assoc 'name alist) ; Restituisce (name . "Alice")
(assoc 'country alist) ; Restituisce #f (chiave non trovata)Estrazione del valore
Una volta recuperata una coppia utilizzando assoc, utilizzare cdr per estrarre il valore:
(cdr (assoc 'name alist)) ; Restituisce "Alice"Riepilogo delle caratteristiche principali
- Citazione singola (
'): crea un elenco statico in cui tutti gli elementi sono dati letterali. - Virgolette inverse (
`): Consente di creare alist dinamiche mescolando elementi statici ed espressioni valutate (con,). - Notazione punto (
.): Utilizzato per costruire coppie, associando una chiave a un valore in un elenco.