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 55e 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.

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