Dopasowanie do wzorca

Kiedy pobieramy i ustawiamy informacje w Stanie Czasu (Time State), możemy używać bardziej złożonych kluczy niż podstawowe symbole takie jak :foo czy ‘:bar. Możesz także używać ciągów znaków w stylu adresów URL zwanymi ścieżkami, np. “/foo/bar/baz”. Gdy już zaczniemy pracować ze ścieżkami, możemy wtedy zacząć korzystać z wyrafinowanego systemu dopasowania wzorców Sonic Pi aby pobierać (get) i synchronizować (sync`) się z ‘podobnymi’ a niekoniecznie ‘takimi samymi’ ścieżkami. Rzućmy okiem.

Dopasuj dowolny segment w ścieżce

Załóżmy, że chcemy poczekać na kolejne zdarzenie, które posiada trzy segmenty w ścieżce:

sync "/*/*/*"

Spowoduje to dopasowanie do dowolnego zdarzenia w Stanie Czasu posiadającego dokładnie trzy segmenty ścieżki, bez względu na ich nazwy. Na przykład:

Jednakże, nie zostaną dopasowane ścieżki z mniejszą lub większą ilością segmentów. Poniższe nie zostaną dopasowane:

Każda gwiazdka * oznacza dowolną treść. Możemy więc dopasować ścieżki tylko z jednym segmentem używając /* lub ścieżek z pięcioma segmentami używając /*/*/*/*/*

Częściowe dopasowanie segmentów

If we know what the segment is going to start or finish with, we can use a * in addition to a partial segment name. For example: "/foo/b*/baz" will match any path that has three segments, the first of which is foo, the last baz and the middle segment can be anything that starts with b. So, it would match:

However, it wouldn’t match the following:

You can also place the * at the start of the segment to specify the last characters of a segment: "/foo/*zz/baz" which will match any 3 segment cue or set where the first segment is foo, the last is baz and the middle segment ends with zz such as "cue "/foo/whizz/baz".

Matching Nested Path Segments

Sometimes you don’t know how many path segments you want to match. In these cases you can use the powerful double star: ** such as "/foo/**/baz" which will match:

Matching Single Letters

You can use the ? character to match against a single char such as "/?oo/bar/baz" which will match:

Matching Multiple Words

If you know that a segment may be one of a select number of words, you can use the { and } matchers to specify a list of choices such as "/foo/{bar,beans,eggs}/quux" which will only match the following:

Matching Multiple Letters

Finally, you can match against a selection of letters if you use the [ and ] matchers to specify a list of choices such as "/foo/[abc]ux/baz" which will match only:

You can also use the - character to specify ranges of letters. For example "/foo/[a-e]ux/baz" which will match only:

Combining Matchers

When calling sync or get you are free to combine matchers in any order you see fit to powerfully match any Time State event created by cue or set. Let’s look at a crazy example:

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/"

OSC Pattern Matching

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