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.

range convida-te a especificar um ponto de inicio, um ponto final e um tamanho de passo. bools permite usar 1s e 0s para sucintamente representar booleans. knitpermite-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.