lilypond-user-fr
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Inclusions automatiques en Scheme (was: Re: Bonjour)


From: Nicolas Sceaux
Subject: Re: Inclusions automatiques en Scheme (was: Re: Bonjour)
Date: Sun, 2 Dec 2007 20:46:43 +0100


Le 2 déc. 07 à 16:58, Valentin Villenave a écrit :
(srfi srfi-39) sert à ajouter une fonctionnalité : des variables
"spéciales", ce sont les variables entourées d'étoiles dans le reste
du code, et qui ne fonctionne pas de la même façon que les autres
variables en Scheme.

Très bien. Est-ce que, à ta connaissance, les prochaines versions de
Guile (avec notamment la R6RS) vont changer quelque chose ? Aura-t-on
toujours besoin d'inclure explicitement cette srfi ?

aucune idée, a priori il faudra toujours.

Toute expression musicale située au "top-level" va être traitée
de façon à générer une partition. Ici, ce n'est pas ce qu'on veut,
puisque le fichier contenant la partition aura déjà été parsé.
L'expression musicale returnée par cette fonction peut être ignorée,
puisqu'elle ne sert à rien. C'est l'effet de bord créé par la
fonction qui est intéressant, pas sa valeur de retour.

Je crains de n'avoir pas fait les études adéquates pour comprendre ces
explications :(
Je ne comprends pas en quoi l'expression serait parsée deux fois, et
même si je le comprenais, alors pourquoi utiliser un
"define-music-function (parser location quoiquecesoit)"
si c'est pour justement ne pas parser l'expression musicale ?

Pour poser ma question plus simplement : qu'est-ce qui différencie ton
code d'un truc tout bête tel que :

includeScore =
#(define-music-function (parser location name) (string?)
   #{ \include " $name/score.ily" #})

(en dehors du fait que ce code ne marche pas ;)

hm, en écrivant mon message je me doutais que ce n'était pas très clair.
Tout d'abord, il faut comprendre que l'utilisation de define-music- function
pour faire une fonction qui va inclure une partition est une bidouille.
En effet, une fonction musicale sert à fabriquer une expression musicale, et à la retourner (l'expression musicale fabriquée est la valeur de retour
de la fonction).
Ici, on veut insérer une partition. Un block \score n'est pas une expression musicale donc une fonction retournant une fonction musicale n'est a priori
pas ce qu'on veut... Si j'en utilise une ici, c'est pour avoir un aspect
plus cohérent du reste. Je trouve plus élégant d'avoir :
  \includeScore "partition"
que :
  #(include-score "partition")

Dans la définition de \includeScore il y a deux parties :

includeScore =
#(define-music-function (parser location name) (string?)
  ;; 1ere partie :
  (parameterize ( (*current-piece* name))
    (ly:parser-parse-string
      (ly:clone-parser parser)
      (format #f "\\include \"~a\""
              (include-pathname "score"))))
  ;; 2eme partie :
  (make-music 'SequentialMusic 'void #t))

En scheme, la valeur de retour de fonction est sa dernière expression.
Dans le cas d'une function musicale, cette expression doit être de type
expression musicale. Donc includeScore doit retourner une expression
musicale. Comme on l'a vu, on block \score n'est pas une expression
musicale, on retourne donc une expression musicale bidon (2ème partie).
La propriété 'void #t est là pour indiquer au parser d'ignorer cette
expression musicale bidon.

La 1ère partie s'occupe de faire le vrai boulot de cette fonction, à
savoir réaliser l'équivalent de :
  \include "score.ily"
en invoquant la fonction ly:parser-parse-string.





reply via email to

[Prev in Thread] Current Thread [Next in Thread]