| [ << Tutoriel Scheme ] | [Racine][Table des matières][Index][ ? ] | [ Interfaces pour programmeurs >> ] | ||
| [ < Variables LilyPond ] | [ Plus haut: Scheme et LilyPond ] | [ Propriétés des objets > ] | ||
1.2.3 Saisie de variables et Scheme
Le format de saisie prend en charge la notion de variable – ou
identificateur. Dans l’exemple suivant, une expression musicale se voit
attribuer un identificateur qui portera le nom de traLaLa.
traLaLa = { c'4 d'4 }
Une variable a aussi une portée. Dans l’exemple suivant, le bloc
\layout contient une variable traLaLa tout à fait
indépendante de l’autre \traLaLa.
traLaLa = { c'4 d'4 }
\layout { traLaLa = 1.0 }
Dans les faits, chaque fichier a un domaine de compétence, et les
différents blocs \header, \midi et \layout ont leur
propre champ de compétence, imbriqué dans ce domaine principal.
Variables et champs de compétence sont implémentés par le système de modules de Guile. Un module anonyme Scheme est attaché à chacun de ces domaines. Une assertion telle que
traLaLa = { c'4 d'4 }
est convertie, en interne, en une définition Scheme :
(define traLaLa valeur Scheme de `...')
Cela signifie que variables LilyPond et variables Scheme peuvent tout à
fait se mélanger. Dans l’exemple suivant, un fragment musical est
stocké dans la variable traLaLa puis dupliqué à l’aide de Scheme.
Le résultat est alors importé dans un bloc \score au moyen d’une
seconde variable twice.
traLaLa = { c'4 d'4 }
#(define newLa (map ly:music-deep-copy
(list traLaLa traLaLa)))
#(define twice
(make-sequential-music newLa))
{ \twice }
Cet exemple est particulièrement intéressant. L’assignation
n’interviendra qu’une fois que l’analyseur grammatical aura l’assurance
que rien du type de \addlyrics ne suit ; il doit donc
vérifier ce qui vient après. Le parser lit le # et
l’expression Scheme qui le suit sans l’évaluer, de telle sorte
qu’il peut procéder à l’assignation, et ensuite exécuter le
code Scheme sans problème.
Cet exemple illustre la manière « d’exporter » une expression musicale
à partir des saisies et à destination de l’interpréteur Scheme.
L’inverse est aussi réalisable : en la plaçant derrière
un $, une valeur Scheme sera interprétée comme si elle avait
été saisie en syntaxe LilyPond. Au lieu de définir \twice, nous
aurions tout aussi bien pu écrire
...
{ $(make-sequential-music (list newLa)) }
Vous pouvez utiliser $ suivi d’une expression Scheme partout où
vous auriez utilisé \nom, dès lors que vous aurez assigné à
cette expression Scheme le nom de variable nom. La substitution
intervenant au niveau de l’analyseur lexical (le lexer), LilyPond
ne saurait faire la différence.
Cette manière de procéder comporte cependant un inconvénient au niveau
de la temporisation. Si nous avions défini newLa avec un
$ plutôt qu’un #, la définition Scheme suivante aurait
échoué du fait que traLaLa n’était pas encore définie. Pour plus
d’information quant au problème de synchronisation, voir la rubrique
Syntaxe Scheme dans LilyPond.
En tout état de cause, le parser évalue le code Scheme en dernier. S’il ne doit être exécuté que plus tard, consultez la rubrique Fonctions Scheme fantômes, ou stockez le dans une macro comme ici :
#(define (nopc)
(ly:set-option 'point-and-click #f))
...
#(nopc)
{ c'4 }
Problèmes connus et avertissements
L’imbrication de variables Scheme et LilyPond n’est pas possible avec l’option ‘--safe’.
| [ << Tutoriel Scheme ] | [Racine][Table des matières][Index][ ? ] | [ Interfaces pour programmeurs >> ] | ||
| [ < Variables LilyPond ] | [ Plus haut: Scheme et LilyPond ] | [ Propriétés des objets > ] | ||
Autres langues : English, deutsch, español.
About automatic language selection.