[ << Tutoriel Scheme ] | [Top][Contents][Index] | [ Interfaces pour programmeurs >> ] |
[ < Saisie de variables et Scheme ] | [ Up : Scheme et LilyPond ] | [ Propriétés des objets > ] |
1.2.5 Import de code Scheme dans LilyPond
L’exemple précédent 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 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éfini. Pour plus
d’information quant au problème de synchronisation, voir la rubrique
Syntaxe Scheme dans LilyPond.
Une autre façon de procéder serait de recourir aux « colleurs de liste »
$@
et #@
dont la fonction est d’insérer les éléments
d’une liste dans le contexte environnant. Grâce à ces opérateurs, la
dernière partie de notre fonction pourrait s’écrire ainsi :
… { #@newLa }
Ici, chaque élément de la liste stockée dans newLa
est pris à
son tour et inséré dans la liste, tout comme si nous avions écrit
{ #(premier newLa) #(deuxième newLa) }
Dans ces deux dernières formes, le code Scheme est évalué alors même que le code initial est en cours de traitement, que ce soit par le lexer ou par le parser. Si le code Scheme ne doit être exécuté que plus tard, consultez la rubrique Fonctions Scheme fantômes, ou stockez-le dans une procédure comme ici :
#(define (nopc) (ly:set-option 'point-and-click #f)) … #(nopc) { c'4 }
[ << Tutoriel Scheme ] | [Top][Contents][Index] | [ Interfaces pour programmeurs >> ] |
[ < Saisie de variables et Scheme ] | [ Up : Scheme et LilyPond ] | [ Propriétés des objets > ] |