[ << Tutoriel Scheme ] | [Racine][Table des matières][Index] | [ Interfaces pour programmeurs >> ] |
[ < Débogage de code Scheme ] | [Plus haut: Scheme et LilyPond ] | [ Import de code Scheme dans LilyPond > ] |
1.2.4 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.
[ << Tutoriel Scheme ] | [Racine][Table des matières][Index] | [ Interfaces pour programmeurs >> ] |
[ < Débogage de code Scheme ] | [Plus haut: Scheme et LilyPond ] | [ Import de code Scheme dans LilyPond > ] |