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

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

Re: Citations et problèmes de référence s circulaires


From: Nicolas Sceaux
Subject: Re: Citations et problèmes de référence s circulaires
Date: Sat, 10 Aug 2013 09:54:50 +0200

Le 10 août 2013 à 02:18, Seventies <address@hidden> a écrit :

> […] les fichiers appelés contiennent également des appels à
> d'autres fichiers pour leurs citations à eux. Et on arrive assez rapidement
> à des références circulaires (A appelle B, qui appelle C, qui appel A, et la
> boucle est bouclée). C'est particulièrement évident lorsqu’on compile avec
> l'option --verbose

Utiliser \tag et \keepWithTag ne peut rien régler, car \include est interprèté
beaucoup plus tôt.

La solution normale à mettre en œuvre (i.e. sans avoir à écrire des commandes
compliquées) consiste à organiser les fichiers différemment.  Par exemple,
mettre dans A.ly, B.ly, etc. uniquement les définitions des notes de A, B, etc.
sans \include et sans bloc \score ; puis mettre dans des fichiers différents
(e.g. score-A.ly, score-B.ily, etc.) les blocs \score et tous les includes
requis.

Une solution plus "technique" consistant à utiliser une commande réalisant un
include conditionnel, est bien entendu possible [1], mais à mon sens, ce n'est
pas la solution adaptée au problème que tu décris.  Dans ton cas, c'est
simplement un problème d'organisation de fichier, qui doit être résolu par une
meilleure organisation de fichiers, plutôt que de tordre la façon de réaliser
des includes.

Nicolas


[1] une fonction générique d'include conditonnel peut avoir la forme :

conditional-include =
#(define-music-function (parser location condition filename) (boolean? string?)
   "Include `filename' if `condition' is met."
   (if condition
       (ly:parser-include-string
        parser
        (format #f "\\include \"~a\"" filename)))
   (make-music 'Music 'void #t))

La fonction que tu demandes serait du type  :

#(define-public (file-already-included? filename) #f)
#(define-public (register-included-filename filename) #f)

#(let ((included-filenames (make-hash-table 31)))
   (set! file-already-included?
         (lambda (filename)
           (not (not (hashq-get-handle included-filenames (string-hash 
filename))))))
   (set! register-included-filename
         (lambda (filename)
           (hashq-set! included-filenames (string-hash filename) #t))))

include-once =
#(define-music-function (parser location filename) (string?)
   "Include `filename' if it has not been included before by \\include-once."
   (if (not (file-already-included? filename))
       (begin
         (ly:parser-include-string
          parser
          (format #f "\\include \"~a\"" filename))
         (register-included-filename filename)))
   (make-music 'Music 'void #t))

\include-once "a.ly"
\include-once "b.ly"
\include-once "a.ly"
\include-once "a.ly"
\include-once "b.ly"


(Note : il vaudrait probablement mieux dans cette fonction transformer les
filenames en chemins absolus)




reply via email to

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