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 12:34:41 +0100


Le 2 déc. 07 à 11:46, Valentin Villenave a écrit :

J'ai eu beau parcourir ton site un certain nombre de fois, jamais je
n'avais trouvé cet article ! Tu ne pourrais pas mettre un lien
"Archives" ou quelque chose dans ton menu de droite ? En l'état, ce
post est quasiment introuvable à moins de connaître son existence...
(et au fait, c'est pour quand la "part 2" ? :)

En fait j'avais passé "hors ligne" ces articles. Il y avait donc un
"part 2", sur la façon de faire des dacapo et compagnie. Puis j'ai
décidé de retirer les articles de ce genre, n'ayant pas trop l'énergie
pour en faire davantage, ni maintenir les précédents. J'ai repassé
"en ligne" l'article sur les inclusions juste avant d'envoyer mon post.

Mon propos était aussi de te demander ton avis sur la question des
includes enchâssés, et notamment de la commande \includeRelative que
proposait Graham, et que j'avais proposé de sponsoriser.

A une époque j'ai aussi regretté de ne pas avoir d'include relatif,
puis je me suis débrouillé autrement, d'abord en ajoutant des
répertoires pour la recherche des fichiers à inclure avec -I sur la
ligne de commande, enfin avec les commandes que j'utilise maintenant.

J'ai eu beau parcourir le code source, je n'arrive pas à trouver où se
situent les définitions de la commande \include (et comme tu t'en
doutes, lancer une recherche pour le terme "include" n'est pas
vraiment d'un grand secours dans du c++... :)

Le code relatif à la commande \include se trouve dans le lexer:
lily/lexer.ll. Rechercher "\\include".

Je suis très bien tes explications, jusqu'au gros bloc de Scheme
suivant, que tu pourrais peut-être expliquer un peu davantage :

;;; Pourquoi est-il nécessaire d'inclure cette srfi précisément ?
;;; Qu'apporte le ice-9 ?
#(use-modules (srfi srfi-39) (ice-9 format))

(ice-9 format) sert à utiliser une fonction format (pour construire
des chaînes de caractères) qui ressemble à celle de Common Lisp et
avec laquelle je suis familié.
(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.

;;; Et ça, c'est pour vider la variable current-piece ? Ou quoi ?
#(define *current-piece* (make-parameter ""))

C'est pour déclarer une variable spéciale. Par défaut, elle vaudra "".
Cette variable sert à sauvegarder le nom du répertoire où se situe
la pièce en cours de traitement.

;;; Là je comprends à peu près. Pourquoi le
;;; if string-null? est-il nécessaire ? Dans quel cas
;;; *current-piece* est-il nul ?
#(define (include-pathname name)
  "Build a pathname string for file `name', based
   on the value of *current-piece*."
  (string-append (if (string-null? (*current-piece*))
                     ""
                     (string-append (*current-piece*) "/"))
                 name ".ily"))

Si *current-piece* vaut "", on ne veut pas ajouter de "/", sinon on va
partir de la racine du système de fichier.

Avec *current-piece* valant "" :
  (include-pathname "violon") ==> "violon.ily"
Avec *current-piece* valant "AAAouverture" :
  (include-pathname "violon") ==> "AAAouverture/violon.ily"

;;; format #f : c'est quoi, au juste ?

C'est pour retourner la chaîne construite avec format. Avec #t
c'est pour écrire la chaîne sur (current-output).

;;; le 'void #t sert à quoi ? tu indiques :
;;; "the music expression can be disregarded",
;;; c'est-à-dire... ?
includeScore =
#(define-music-function (parser location name) (string?)
  (parameterize ( (*current-piece* name))
    (ly:parser-parse-string
      (ly:clone-parser parser)
      (format #f "\\include \"~a\""
              (include-pathname "score"))))
  (make-music 'SequentialMusic 'void #t))

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.

;;; Deux questions :
;;; -pourquoi Voice = "" ? Sans les guillemets, tu risquerais quoi ?

sans doute rien :-)

;;; -pourquoi appeler explicitement le \notemode ? Je croyais
;;; que la construction #{...#} l'appelait implicitement.

C'est vrai, mais au début ce n'était pas le cas. C'est une survivance
de ces anciens temps.

nicolas





reply via email to

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