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