# Anelli

Un’altra opzione interessante sulle liste standard sono gli anelli (ring). Se conosci un po’ di programmazione, potresti aver incontrato anelli buffer o anelli array. Qui, per comodità e semplicità, utilizzeremo solo anelli.

Nella sezione precedente abbiamo visto come accedere agli elementi di una lista utilizzando il sistema dell’indice:

    puts [52, 55, 59][1]

Ora, cosa succede se vogliamo l’indice `100`? Beh, ovviamente non c’è nessun elemento all’indice 100 perché la lista contiene solo 3 elementi. Sonic Pi restituirà `nil` che significa nulla.

Tuttavia, consideriamo di avere un contatore come, ad esempio, la pulsazione corrente che viene incrementata di continuo. Creiamo il nostro contatore e la nostra lista:

    counter = 0
    notes = [52, 55, 59]

Possiamo usare il nostro contatore per accedere alle note nella lista:

    puts notes[counter]

Bene, abbiamo `52`. Ora, incrementiamo il nostro contatore per ottenere un’altra nota:

    counter = (inc counter)
    puts notes[counter]

Fantastico, ora abbiamo `55` e se lo facciamo di nuovo otteniamo `59`. Se, però, lo facciamo ancora, non avremo più numeri nella nostra lista e otterremo `nil`. E se volessimo tornare all’inizio della lista e ricominciare da capo? A questo servono gli anelli.

## Creare anelli

Abbiamo due modi per creare un anello. Possiamo usare `ring` come funzione dell’elemento o ring come parametro:

    (ring 52, 55, 59)

Oppure possiamo prendere una normale lista e convertirla in un anello inviando il messaggio `.ring`:

    [52, 55, 59].ring

## Indicizzare gli anelli

Quando abbiamo un anello, possiamo usarlo esattamente come abbiamo fatto con le normali liste con l’eccezione che possiamo usare indici che sono negativi oppure di grandezza maggiore rispetto all’anello perché ripartiranno da capo e punteranno sempre a un elemento dell’anello:

    (ring 52, 55, 59)[0] #=> 52
    (ring 52, 55, 59)[1] #=> 55
    (ring 52, 55, 59)[2] #=> 59
    (ring 52, 55, 59)[3] #=> 52
    (ring 52, 55, 59)[-1] #=> 59

## Utilizzare gli anelli

Diciamo che vogliamo utilizzare una variabile per rappresentare il battito corrente. Possiamo usarla come indice nel nostro anello per scegliere le note da suonare o i tempi di rilascio oppure qualsiasi altra cosa che abbiamo salvato nel nostro anello, indipendentemente dal numero di battiti in cui siamo.

## Scale e accordi sono anelli

Una cosa interessante da sapere è che liste restituite da `scale` e `chord` sono anche anelli e ci possiamo accedere con indici arbitrari.

## Costruzione di anelli

Oltre a `ring` ci sono una serie di altre funzioni che costruiranno un anello per noi.

- `range` ci invita a specificare un punto di partenza, uno di fine e la grandezza dei passi.
- `bools` ci permette di usare `1` e `0` per rappresentare variabili booleane.
- `knit` ci consente di unire una sequenza di valori ripetuti.
- `spread` crea un anello di booleani con una distribuzione euclidea.

Dai un’occhiata alla relativa documentazione per maggiori informazioni a riguardo.