# Anéis

Um variação interessante às listas padrão são os anéis. Se sabes alguma programação, poderás conhecer buffers em anel ou arrays em anel. Aqui chamam-se apenas anéis - é curto e simples.

Na secção anterior sobre listas vimos que podíamos obter elementos dela usando o mecanismo de indexação:

    puts [52, 55, 59][1]

O que acontece se queremos o índice `100`? Bem, claramente que não existe elemento no índice 100 porque a lista só tem 3 elementos. Assim o Sonic Pi devolve `nil` que significa nada.

No entanto, considera que temos um contador tal como a batida corrente que aumenta continuamente. Vamos criar o nosso contador e a nossa lista:

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

Podemos usar o nosso contador para aceder a nota na nossa lista:

    puts notes[counter]

Boa, obtemos `52`. Agora, vamos aumentar o nosso contador e obter outra nota:

    counter = (inc counter)
    puts notes[counter]

Fantástico, agora obtemos `55`e se o fizéssemos outra vez obteria-mos `59`. No entanto, se o fizéssemos outra vez, ficaríamos sem números na nossa lista e obteríamos `nil`. E se quiséssemos regressar ao inicio da lista novamente? É para isto que os anéis servem.

## Criando anéis

Podemos criar anéis de duas maneiras. Ou usamos a função `ring` com os elementos do anel como parâmetros:

    (ring 52, 55, 59)

Ou podemos usar uma lista normal e converter num anel enviando a mensagem `.ring`:

    [52, 55, 59].ring

## Indexando anéis

Depois de termos um anel, podemos usar exactamente da mesma maneira que usaríamos uma lista normal com a excepção que podemos usar índices que são negativos ou maiores que o tamanho do anel e eles enrolam de forma a apontar sempre para um elemento do anel:

    (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

## Usando anéis

Imagina que estamos a usar uma variável que representa o número corrente do beat. Podemos usar isto como índice no nosso anel para buscar notas a tocar, ou tempos de release ou qualquer coisa útil que podemos armazenar no nosso anel independentemente do número de beat que estamos correntemente.

## Escalas e acordes são anéis

Uma coisa útil é que as listas devolvidas por `scale` e `chord` são também anéis e permitem que os acedas com índices arbitrários.

## Construtores de anéis

Além de `ring` existem algumas outras funções que constroem um anel por nós.

- `range` convida-te a especificar um ponto de inicio, um ponto final e um tamanho de passo.
- `bools` permite usar `1`s e `0`s para sucintamente representar booleans.
- `knit`permite-te tricotar uma sequência de valores repetidos.
- `spread` cria um anel de bools com uma distribuição Euclidiana.

Dá uma vista de olhos na documentação respectiva para mais informação.