3.3.  Liste, liste e ancora liste

Abbiamo fatto pratica con le variabili e le funzioni, ora si entra nella palude fangosa delle liste di Scheme.

Prima di approfondire le liste è necessario comprendere la differenza tra valori atomici e liste.

Avete già visto i valori atomici quando abbiamo inizializzato le variabili nella sessione precedente. Un valore atomico è un valore singolo. Ad esempio possiamo assegnare alla variabile "x" il valore 8 nell'istruzione seguente:

(let* ( (x 8) ) x)

(Abbiamo aggiunto l'espressione x alla fine per stampare il valore assegnato a x-- normalmente non si dovrebbe averne bisogno. Si noti come <code>let*</code> operi come una funzione: il valore dell'ultima istruzione è il valore restituito.)

Una variabile può anche riferirsi ad una lista di valori piuttosto che a un singolo valore. Per assegnare alla variabile x la lista di valori 1, 3, 5 si digiti:

(let* ( (x '(1 3 5))) x)

Si provi a digitare entrambe le istruzioni nella console Script-fu e si osservino le risposte. Quando si digita la prima istruzione si ottiene semplicmente il risultato:

8

Mentre se si digita l'altra istruzione si ottiene il seguente risultato:

(1 3 5)

Quando si ottiene il valore 8 l'interprete sta informando che x contiene il valore atomico 8 mentre quando si ottiene (1 3 5) sta informando che x contiene non un valore singolo bensì una lista di valori. Si noti che non ci sono virgole nella dichiarazione o assegnamento della lista, tantomeno nel risultato stampato.

La sintassi per definire una lista è:

'(a b c)

dove a, b, e c sono letterali. Si usa l'apostrofo (') per indicare che ciò che segue nelle parentesi è una lista di valori letterali piuttosto che una funzione o un'espressione.

Una lista vuota può essere definita come segue:

'()

o semplicemente:

()

Le liste possono contenere valori atomici così come altre liste:

(let*
   (
        (x
           '("GIMP" (1 2 3) ("is" ("great" () ) ) )
        )
    )
    x
)
      

Si noti che dopo il primo spostrofo non vi è più bisogno di utilizzare un apostrofo per definire le liste interne. Si provi a copiare l'istruzione nella console Script-Fu e ad eseguirla per vedere cosa restituisce.

Si noti come il risultato restituito non è una lista di valori atomici singoli ma piuttosto è una lista di letterali <code>("GIMP")</code>, la lista <code>(1 2 3)</code>, ecc.