Wanneer je informatie haalt (‘get’) van de Time State of gegevens in de Time State vastlegd (‘set’), kun je ook complexere waarden gebruiken dan de basissymbolen zoals ‘:foo’ en ‘:bar’. Je kan bijvoorbeeld paden in een URL-stijl gebruiken zoals ‘/foo/bar/baz’. Zodra we zulke paden gaan gebruiken, kunnen we voordeel halen uit de slimme patroonherkenning van Sonic Pi, zodat we met vergelijkbare (‘similar’) in plaats van precies gelijke (‘identical’) paden kunnen halen (‘get’) en synchroniseren (‘sync’). Laten we eens kijken.
Laten we aannemen dat wij willen wachten op een volgend event dat beschikt over drie pad segmenten:
sync "/*/*/*"
Dit zal overeenkomen met ieder ‘Time State’ event met exact drie pad segmenten, ongeacht hun namen. Bijvoorbeeld:
cue "/bla/bar/baz"
cue "/bla/baz/quux"
cue "/eggs/beans/toast"
cue "/moog/synths/rule"
Het zal echter niet matchen voor paden met minder of meer pad segmenten. Het volgende zal niet matchen:
cue "/bla/bar"
cue "/bla/baz/quux/quaax"
cue "/eggs"
Iedere *
betekent elke inhoud. We kunnen paden matchen met slechts één segment met /*
of paden met vijf segmenten middels /*/*/*/*/*
Als we weten waar een segment mee zal beginnen of eindigen kunnen dat deel segment samen met *
gebruiken. Bijvoorbeeld: "/bla/b*/baz"
zal elk pad matchen dat drie segmenten heeft waarbij het eerste bla
en het laatste baz
is, het middelste segment kan alles zijn dat begint met een b
. Dus het volgende zal matchen:
cue "/bla/bar/baz"
cue "/bla/baz/baz"
cue "/bla/beans/baz"
Het zou echter niet matchen met het volgende:
cue "/bla/flibble/baz"
cue "/bla/abaz/baz"
cue "/bla/beans/baz/eggs"
Je kunt ook een *
aan het begin van een segment zetten om te matchen met laatste tekens van het segment: "/bla/*ux/baz"
welke matcht met een cue
of set
van 3 segmenten, waarbij het eerste bla
en het laatste baz
is, het middelste segment eindigd met ux
. Zoals bijvoorbeeld:
Soms weet je niet uit hoeveel segmenten een pad dat je wilt matchen bestaat. In dat geval kun je gebruik maken van de krachtige dubbele asterix: **
. Zo zal "/bla/**/baz"
met het volgende matchen:
cue "/bla/bar/baz"
cue "/bla/bar/beans/baz"
cue "/bla/baz"
cue "/bla/a/b/c/d/e/f/baz"
Je kunt het ?
karakter gebruiken om te matchen met een single karakter zoals "/?oo/bar/baz"
wat zal matchen met:
cue "/bla/bar/baz"
cue "/goo/bar/baz"
cue "/too/bar/baz"
cue "/woo/bar/baz"
Als je weet dat een segment een van een select aantal woorden moet matchen kun je {
en }
haken gebruiken om een lijst van keuzes te geven. Zo zal "/bla/{bar,beans,eggs}/quux"
alleen met het volgende matchen:
cue "/bla/bar/quux"
cue "/bla/beans/quux"
cue "/bla/eggs/quux"
Als laatste kun je ook matchen op een selectie van letters door de [
en ]
haken te gebruiken om een lijst van keuzes aan te geven. Zo al "/bla/[abc]ux/baz"
alleen met het volgende matchen:
cue "/bla/aux/baz"
cue "/bla/bux/baz"
cue "/bla/cux/baz"
Je kunt ook een -
gebruiken om aan te geven dat het om een rij van letters gaat. Zo zal "/bla/[a-e]ux/baz"
alleen matchen met:
cue "/bla/aux/baz"
cue "/bla/bux/baz"
cue "/bla/cux/baz"
cue "/bla/dux/baz"
cue "/bla/eux/baz"
Wanneer sync
of get
wordt aangeroepen ben je geheel vrij de Matchers
in iedere volgorde te gebruiken met elk Time State
event aangemaakt door cue
of set
. Laten we het volgende (ver gezochte) voorbeeld bekijken:
in_thread do
sync "/?la/[a-z]*/**/ba*/{quux,quaax}/"
sample :loop_amen
end
sleep 1
cue "/bla/beans/a/b/c/d/e/bark/quux/"
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