[ << Tutoriel Scheme ] | [Racine][Table des matières][Index] | [ Interfaces pour programmeurs >> ] |
[ < Saisie de variables et Scheme ] | [Plus haut: 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 (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é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 ] | [Racine][Table des matières][Index] | [ Interfaces pour programmeurs >> ] |
[ < Saisie de variables et Scheme ] | [Plus haut: Scheme et LilyPond ] | [ Propriétés des objets > ] |