Pattern Matching

Al obtener y establecer información en el Estado de Tiempo, es posible utilizar claves más complejas que los símbolos básicos como :foo y :bar. También se pueden utilizar cadenas de estilo URL llamadas rutas como "/foo/bar/baz". Una vez que empecemos a trabajar con rutas, podemos empezar a aprovechar el sofisticado sistema de concordancia de patrones de Sonic Pi para get (obtener) y sync (sincronizar) con rutas similares en lugar de idénticas. Echemos un vistazo.

Match any path segment

Let’s assume we want to wait for the next event that has three path segments:

sync "/*/*/*"

This will match any Time State event with exactly three path segments, regardless of their names. For example:

However, it will not match paths with fewer or more path segments. The following will not match:

Each * means any content. So we could match paths with just one segment with /* or paths with five segments with /*/*/*/*/*

Matching partial segments

Si sabemos con qué va a empezar o terminar el segmento, podemos utilizar un * además de un nombre de segmento parcial. Por ejemplo: "/foo/b*/baz" coincidirá con cualquier ruta que tenga tres segmentos, el primero de los cuales es foo, el último baz y el segmento del medio puede ser cualquier cosa que empiece por b. Por lo tanto, coincidiría:

Sin embargo, esto no sería igual lo siguiente:

También puede colocar el * al principio del segmento para especificar los últimos caracteres de un segmento: "/foo/*zz/baz" que coincidirá con cualquier cue o set de 3 segmentos donde el primer segmento sea foo, el último sea baz y el segmento del medio termine con zz como "cue "/foo/whizz/baz".

Coincidiendo Segmentos de la Ruta Anidados

A veces no se sabe con cuántos segmentos de la ruta se quiere hacer coincidir. En estos casos puede utilizar la poderosa estrella doble: ** como "/foo/**/baz" que coincidirá:

Coincidiendo de a una Letra

Puedes usar el caracter ? para coincidir un caracter en particular como por ejemplo "/?oo/bar/baz" coincidirá con:

Coincidiendo Multiples Palabras

Si sabe que un segmento puede ser uno de un número selecto de palabras, puede utilizar los comparadores { y } para especificar una lista de opciones como "/foo/{bar,beans,eggs}/quux" que sólo coincidirá con lo siguiente:

Coincidiendo Multiples Letras

Por último, puede comparar con una selección de letras si utiliza los comparadores [ y ] para especificar una lista de opciones como "/foo/[abc]ux/baz" que sólo coincidirá:

También puede utilizar el carácter - para especificar rangos de letras. Por ejemplo, "/foo/[a-e]ux/baz", que sólo coincidirá con:

Combinando Algoritmos de Coincidencia

Al llamar a sync o get eres libre de combinar “matchers” en el orden que consideres oportuno para hacer coincidir poderosamente cualquier evento de Time State creado por cue o set. Veamos un ejemplo muy rebuscado:

in_thread do
  sync "/?oo/[a-z]*/**/ba*/{quux,quaax}/"
  sample :loop_amen
end
sleep 1
cue "/foo/beans/a/b/c/d/e/bark/quux/"

Coincidencia de patrones OSC

For those curious, these matching rules are based on the Open Sound Control pattern matching specification which is explained in detail here: https://opensoundcontrol.stanford.edu/spec-1_0.html