[ << Tutoriel Scheme ] | [Top][Contents][Index] | [ Interfaces pour programmeurs >> ] |
[ < Débogage de code Scheme ] | [ Up : 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 ] | [Top][Contents][Index] | [ Interfaces pour programmeurs >> ] |
[ < Débogage de code Scheme ] | [ Up : Scheme et LilyPond ] | [ Import de code Scheme dans LilyPond > ] |