Сопоставление паттернов

При получении и установке информации в Time State можно использовать более сложные ключи, чем основные символы, такие как : foo и: bar. Вы также можете использовать строки в стиле URL, которые называются пути (paths), например " / foo / bar / baz ". Как только мы начнем работать с путями, мы сможем воспользоваться преимуществами реализованной в Sonic Pi сложной системы сопоставления паттернов для того, чтобы пользоваться функциями get и sync с похожими, а не с полностью идентичными путями. Давайте взглянем на это.

Сопоставление любого сегмента пути

Предположим, что мы хотим дождаться следующего события, которое имеет три сегмента пути:

sync "/*/*/*"

Это будет сопоставимо с любым событием Time State с тремя сегментами пути, независимо от их имен. Например:

Однако он * не будет * сопоставляться с путями с меньшим или большим количеством сегментов. Следующие пути не будут сопоставляться:

Каждый символ * означает * любой контент *. Таким образом, мы можем сопоставлять между собой пути с одним сегментом с / * или пути с пятью сегментами с / * / * / * / * / *

Сопоставление частичных сегментов

Если мы знаем, с чего начинается или заканчивается сегмент, мы можем использовать * в дополнение к частичному имени сегмента. Например: " / foo / b * / baz " будет соответствовать любому пути, который имеет три сегмента, первый из которых foo, последний baz, а средний сегмент может быть любым, начинающимся с b. Таким образом, с этим будут сопоставимы следующие пути:

Однако, не будут сопоставимы следующие пути:

Вы также можете поместить * в начале сегмента, чтобы указать последние символы сегмента: " / foo / * zz / baz ", который будет соответствовать любым 3 сегментам cue или set, где первый сегмент - foo, последний - baz, а средний сегмент заканчивается zz, например "cue" / foo / whizz / baz ".

Сопоставление вложенных сегментов пути

Иногда вы не знаете, сколько сегментов пути вы хотите сопоставить. В этих случаях вы можете использовать возможности двойной звезды: **, например " / foo / ** / baz ". Тогда это будет сопоставимо с:

Сопоставление отдельных букв

Вы можете использовать символ ? для сопоставления с одним символом. Например " /? оo / bar / baz ", что будет сопоставимо с:

Сопоставление из множества слов

Если вы знаете, что сегмент может быть представлен словом из заданного набора, вы можете использовать сопоставители { и }, чтобы указать список вариантов. Например `” / foo / {bar, beans, eggs} / quux “, что может быть сопоставлено только со следующим:

Сопоставление из множества букв

Наконец, вы можете сопоставить сегмент из набора букв, если используете сопоставители [ и ], чтобы указать список вариантов. Например путь " / foo / [abc] ux / baz " будет сопоставим только с:

Вы также можете использовать символ - для указания диапазонов букв. Например, " / foo / [a-e] ux / baz "будет сопоставим только с:

Объединение сопоставителей

При вызове sync или get вы можете комбинировать сопоставители в любом порядке, который вы считаете подходящим для сопоставления любому событию Time State, заданному с помощью cue или set. Давайте рассмотрим потрясающий пример:

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

Для тех, кому интересно, эти правила сопоставления основаны на спецификации сопоставления паттернов протокола Open Sound Control. Подробности описаны здесь: http://opensoundcontrol.org/spec-1_0