Quand vous obtenez et affectez de l’information dans l’État du Temps, il est possible d’utiliser des clés plus complexes que les symboles basiques comme :foo
et :bar
. Vous pouvez également utiliser des chaînes de caractères de format URL appelées chemin comme "/foo/bar/baz"
. Lorsque nous avons commencé à travailler avec les chemins, nous pouvons commencer à prendre avantage du système sophistiqué de correspondance de motif de Sonic Pi pour get
et sync
des chemins “similaires” au lieu “d’identiques”. Étudions cela de plus près.
Assumons que nous voulons attendre pour le prochain événement qui a trois segments de chemin :
sync "/*/*/*"
Ceci va faire une correspondance avec tout événement d’État du Temps avec exactement trois segments de chemin, et ce, peu importe leur nom. Par exemple :
cue "/foo/bar/baz"
cue "/foo/baz/quux"
cue "/eggs/beans/toast"
cue "/moog/synths/rule"
Toutefois, ça ne correspondra pas avec des chemins qui ont plus ou moins de segments. L’élément suivant n’aura pas de correspondance :
cue "/foo/bar"
cue "/foo/baz/quux/quaax"
cue "/eggs"
Chaque *
signifie n’importe quel contenu. Donc, nous pourrions trouver des correspondance avec des chemins d’un seul segment avec /*
ou des chemins avec cinq segments avec /*/*/*/*/*
Si nous savons par quoi le segment va commencer ou finir, nous pouvons utiliser un *
en plus d’un nom de segment partiel. Par exemple : "/foo/b*/baz"
correspondra à tout chemin possédant trois segments, le premier étant foo
, le dernier baz
, et celui du milieu pouvant être n’importe quoi commençant par un b
. Il correspondra alors à :
cue "/foo/bar/baz"
cue "/foo/baz/baz"
cue "/foo/beans/baz"
Cependant, cela ne correspondrait pas avec ceci :
cue "/foo/flibble/baz"
cue "/foo/abaz/baz"
cue "/foo/beans/baz/eggs"
Vous pouvez également placer le *
au début du segment pour spécifier les derniers caractères d’un segment : "/foo/*zz/baz"
ce qui correspondra à n’importe quel triple segment cue
ou set
où le premier segment est foo
, le dernier est baz
et celui du milieu fini avec zz
comme "cue "/foo/whizz/baz"
.
Parfois, vous ne connaissez pas le nombre de segments de chemin devant correspondre. Dans ce cas, vous pouvez utiliser la puissante double-étoile : **
et ainsi "/foo/**/baz"
correspondra à :
cue "/foo/bar/baz"
cue "/foo/bar/beans/baz"
cue "/foo/baz"
cue "/foo/a/b/c/d/e/f/baz"
Vous pouvez utiliser le caractère ?
pour faire une correspondance sur un seul caractère comme "/?oo/bar/baz"
ce qui correspondra avec :
cue "/foo/bar/baz"
cue "/goo/bar/baz"
cue "/too/bar/baz"
cue "/woo/bar/baz"
Si vous savez qu’un segment pourrait être un parmi un ensemble particulier de mots, vous pouvez utiliser les correspondances {
et }
pour spécifier une liste de choix tel que "/foo/{bar,beans,eggs}/quux"
qui correspondra uniquement à ceci :
cue "/foo/bar/quux"
cue "/foo/beans/quux"
cue "/foo/eggs/quux"
Finalement, vous pouvez faire correspondre à une sélection de lettres si vous utilisez les correspondances [
et ]
pour spécifier une liste de choix tel que "/foo/[abc]ux/baz"
qui correspondra uniquement à :
cue "/foo/aux/baz"
cue "/foo/bux/baz"
cue "/foo/cux/baz"
Vous pouvez également utiliser le caractère -
pour spécifier un ensemble de lettres. Par exemple "/foo/[a-e]ux/baz"
qui correspondra uniquement à :
cue "/foo/aux/baz"
cue "/foo/bux/baz"
cue "/foo/cux/baz"
cue "/foo/dux/baz"
cue "/foo/eux/baz"
En appelant sync
ou get
, vous êtes libre de combiner des correspondances dans n’importe quel ordre qui vous convient pour faire correspondre des événements d’État du Temps créés par cue
ou set
. Regardons un exemple fou :
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/"
Pour les curieux, ces règles de correspondance sont basées sur la spécification de correspondance de motif Open Sound Control, qui est expliquée en détail ici : http://opensoundcontrol.org/spec-1_0