Elenchi di associazioni (Alisti)

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.

;; Manually define an alist
(define alist '((name . "Alice") (age . 30) (city . "Paris")))

;; Programmatically add a new pair
(define updated-alist (cons '(country . "France") alist))

Risultato: ((country . "France") (name . "Alice") (age . 30) (city . "Paris"))

Utilizzo delle virgolette inverse (`) and Comma (,)

L’operatore virgolette inverse (`) is similar to the single quote but allows you to dynamically insert evaluated expressions using the comma (,). 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 ` and ,:

(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)   ; Returns (name . "Alice")
(assoc 'country alist) ; Returns #f (key not found)

Estrazione del valore

Una volta recuperata una coppia utilizzando assoc, utilizzare cdr per estrarre il valore:

(cdr (assoc 'name alist))   ; Returns "Alice"

Riepilogo delle caratteristiche principali

  • Citazione singola ('): crea un elenco statico in cui tutti gli elementi sono dati letterali.
  • Citazione inversa (`): Allows dynamic creation of alists by mixing static elements with evaluated expressions (using ,).
  • Notazione punto (.): Utilizzato per costruire coppie, associando una chiave a un valore in un elenco.