[ << Interfaces pour programmeurs ] | [Racine][Table des matières][Index][ ? ] | [ Interfaces LilyPond Scheme >> ] | ||
[ < Fonctions Scheme ] | [ Plus haut: Fonctions Scheme ] | [ Utilisation de fonctions Scheme > ] |
2.2.1 Définition de fonctions Scheme
D’une manière générale, une fonction Scheme se définit ainsi :
fonction = #(define-scheme-function (parser location arg1 arg2…) (type1? type2?…) corps)
où
parser | doit être littéralement parser , de telle sorte que
l’analyseur grammatical puisse accéder aux blocs de code LilyPond
(#{ …#} ). |
location | doit être littéralement location , de telle sorte que soit
accessible l’emplacement de l’objet dans la source, aux fins de
transmettre aux messages d’erreur les fichier et numéro de ligne. |
argN | nième argument |
typeN? | un type de prédicat Scheme pour lequel argN
devra retourner #t . Il existe aussi une forme spécifique –
(prédicat? default) – qui permet de fournir des
argument optionnels. En l’absence d’argument réel au moment de l’appel
à la fonction, c’est la valeur par défaut qui lui sera substituée. Les
valeurs par défaut sont évaluées dès l’apparition de la définition, y
compris dans le cas de blocs de code LilyPond ; vous devrez donc,
si ces valeurs par défaut ne peuvent être déterminées que plus tard,
mentionner une valeur spéciale que vous reconnaîtrez facilement.
Lorsque vous mentionnez un prédicat entre parenthèses sans toutefois
fournir sa valeur par défaut, celle-ci sera considérée comme étant
#f . Les valeurs par défaut d’un prédicat? ne sont
vérifiées ni au moment de la définition, ni à l’exécution ; il est
de votre ressort de gérer les valeurs que vous spécifiez. Une valeur
par défaut constituée d’une expression musicale est recopiée dès la
définition de origin vers le paramètre location . |
corps | une séquence de formules Scheme évaluées dans l’ordre, la dernière
servant de valeur de retour de la fonction. Il peut contenir des blocs
de code LilyPond, enchâssés dans des accolades et hashes –
#{…#} – comme indiqué à la rubrique
Blocs de code LilyPond. Au sein d’un bloc de code LilyPond, un
# permet de référencer des arguments de la fonction – tel
‘#arg1’ – ou d’ouvrir une expression Scheme contenant les
arguments de la fonction – par exemple ‘#(cons arg1 arg2)’.
Dans le cas où une expression Scheme introduite par # ne vous
permet pas de parvenir à vos fins, vous pourriez devoir revenir à une
expression Scheme « immédiate » à l’aide d’un $ , comme
‘$music’.
Lorsque votre fonction retourne une expression musicale, lui est
attribuée la valeur origin . |
La recevabilité des arguments est déterminée par un appel effectif au
prédicat après que LilyPond les a déjà converti en expression Scheme.
Par voie de conséquence, l’argument peut tout à fait se libeller en
syntaxe Scheme – introduite par un #
ou en tant que résultat
d’un appel à une fonction Scheme. Par ailleurs, LilyPond convertira en
Scheme un certain nombre de constructions purement LilyPond avant même
d’en avoir vérifié le prédicat. C’est notamment le cas de la musique,
des postévénements, des chaînes simples (avec ou sans
guillemets), des nombres, des markups et listes de
markups, ainsi que des blocs score, book,
bookpart, ou qui définissent un contexte ou un format de sortie.
Il existe certaines formes d’expression, comme la plupart du temps où la
musique n’est pas bornée par des accolades, où LilyPond doit lire
au-delà de cette même expression afin d’en déterminer la fin. Si une
telle expression devait, après évaluation du prédicat, faire l’objet
d’un argument optionnel, LilyPond n’aurait aucun moyen, à partir du
moment où il aura décidé que l’expression ne correspond pas au
paramètre, de « revenir en arrière ». C’est la raison pour laquelle
certaines formes musicales devraient être bornées par des accolades pour
que LilyPond puisse les reconnaître efficacement. Il existe d’autres
situations pour lesquelles LilyPond lèvera toute ambiguïté grâce aux
fonctions de prédicat : un ‘-3’ est-il un postévénement
de type doigté ou un nombre négatif ? Un "a" 4
en mode
paroles est-il une chaîne suivie d’un nombre ou bien un événement
syllabe de durée 4
? LilyPond répondra à ces questions
par des interprétations successives du prédicat de l’argument, dans un
ordre défini de sorte à minimiser les interprétations erronées et le
besoin de lecture en avance.
Un prédicat qui accepte par exemple aussi bien une expression musicale
qu’une hauteur considèrera c''
comme étant une hauteur plutôt
qu’une expression musicale. Les durées ou postévénements qui
viennent juste après pourraient ne pas être cohérents avec cette
interprétation. C’est la raison pour laquelle il vaut mieux éviter des
prédicats par trop permissifs tel que Scheme?
lorsque
l’application fait plutôt appel à des type d’argument plus spécifiques.
Les différents types des prédicat propres à LilyPond sont recensés à l’annexe Types de prédicats prédéfinis.
Voir aussi
Manuel de notation : Types de prédicats prédéfinis.
Fichiers d’initialisation : ‘lily/music-scheme.cc’, ‘scm/c++.scm’, ‘scm/lily.scm’.
[ << Interfaces pour programmeurs ] | [Racine][Table des matières][Index][ ? ] | [ Interfaces LilyPond Scheme >> ] | ||
[ < Fonctions Scheme ] | [ Plus haut: Fonctions Scheme ] | [ Utilisation de fonctions Scheme > ] |
Autres langues : English, deutsch, español.
About automatic language selection.