Subject: Une question de Scheme

From: Loïc Chahine <[email-masked]>
Date: Sat, 18 May 2013 13:57:26 +0200

Bonjour à tous,

J’aimerais améliorer une fonction que j’avais écrite et que Nicolas 
Sceaux m’a déjà améliorée (voir ci-dessous). En fait, il me manque juste 
(pour pouvoir essayer) un truc en Scheme. Actuellement, je dis à la 
fonction le nom du fichier de paroles (lyricsFile) en entier, par 
exemple : "paroles.ly".
\aVaud #"Quand on a prononcé" #"QuandOnAPrononce" #"paroles.ly"
J’aimerais trouver le moyen de dire juste "paroles" et que ça complète 
tout seul par ".ly". Comme ça, je pourrais faire un truc avec une 
condition et si la condition est remplie, lui dire de compléter par 
"2.ly" (pour obtenir "paroles2.ly").
Je suis à peu près sûr que quelqu’un sait, alors merci d’avance !
L.C.

aVaud =
#(define-music-function (parser location designation dossier lyricsFile)
(string? string? string?)
(define (pathname file)
(format #f "~a/~a" dossier file))
;; incrémente l'indice de la fable
(set! vaud-number (1+ vaud-number))
;; titre
(add-text parser (make-titre-vaud-markup
vaud-number designation))
(add-music parser
(make-music 'Music
'page-marker #t
'page-break-permission 'forbid))
#{
\new ChoirStaff <<
\new Staff {
\autoBeamOff
\include $(pathname "music.ly")
}
\addlyrics {
%\set stanza = "1."
\include $(pathname lyricsFile)
}
 >> #})

---

From: Nicolas Sceaux <[email-masked]>
Date: Sat, 18 May 2013 16:40:31 +0200

Le 18 mai 2013 à 13:57, Loïc Chahine <[email-masked]> a écrit :

> J’aimerais trouver le moyen de dire juste "paroles" et que ça complète tout seul par ".ly". Comme ça, je pourrais faire un truc avec une condition et si la condition est remplie, lui dire de compléter par "2.ly" (pour obtenir "paroles2.ly").

Pour construire des chaînes de caractère, je suggère d'utiliser la fonction format.
Son usage est décrit ici :
  <http://www.gnu.org/software/guile/manual/html_node/Formatted-Output.html#index-format>

(let ((fichier "toto"))
   (format #f "~a.ly" fichier))
=> "toto.ly"

(let ((fichier "toto")
       (index 2))
   (format #f "~a~a.ly" fichier index))
=> "toto2.ly"

---

From: Loïc Chahine <[email-masked]>
Date: Sat, 18 May 2013 16:42:28 +0200

Merci, Nicolas, c’est ce que je cherchais ! (Mais je croyais que c’était 
pour les chiffres et que ~a voulait dire ‘arabic’… Bon, mes talents de 
divinations sont vraiment à revoir.)

---

From: Loïc Chahine <[email-masked]>
Date: Sat, 18 May 2013 18:58:13 +0200

Bonsoir à tous,

Autre question, que j’avais pas vu venir. Re-voici ci-dessous le code 
modifié avec un (if …). Le problème, c’est que ça m’oblige à répéter. Là 
encore, je suis sûr que certains verront très bien comment optimiser ! 
En gros, il faudrait pouvoir laisser une expression Lily pas finie, 
mettre le (if …), et la finir après.

Merci d’avance !
L.

aVaud =
#(define-music-function (parser location designation dossier couplets)
      (string? string? number?)
    (define (pathname file)
      (format #f "~a/~a" dossier file))
    ;; incrémente l'indice de la fable
    (set! vaud-number (1+ vaud-number))
    ;; titre
    (add-text parser (make-titre-vaud-markup
                      vaud-number designation))
    (add-music parser
               (make-music 'Music
                           'page-marker #t
                           'page-break-permission 'forbid))
    (if (= couplets 2)
    #{
     \new ChoirStaff <<
       \new Staff {
         \autoBeamOff
         \include $(pathname "music.ly")
       }
       \addlyrics {
         %\set stanza = "1."
         \include $(pathname "paroles.ly")
       }
    >> #}
     #{
       \new ChoirStaff <<
       \new Staff {
         \autoBeamOff
         \include $(pathname "music.ly")
       }
       \addlyrics {
         %\set stanza = "1."
         \include $(pathname "paroles.ly")
       }
       \addlyrics {
         \include $(pathname "paroles.ly")
       }
     #}))

---

From: Nicolas Sceaux <[email-masked]>
Date: Sat, 18 May 2013 19:59:41 +0200

Le 18 mai 2013 à 18:58, Loïc Chahine <[email-masked]> a écrit :

> Bonsoir à tous,
> 
> Autre question, que j’avais pas vu venir. Re-voici ci-dessous le code modifié avec un (if …). Le problème, c’est que ça m’oblige à répéter. Là encore, je suis sûr que certains verront très bien comment optimiser ! En gros, il faudrait pouvoir laisser une expression Lily pas finie, mettre le (if …), et la finir après.
> 
> Merci d’avance !

Je dirais qu'il vaut mieux laisser comme ça, c'est bien compréhensible,
et la partie répétée n'est pas tellement grande, notamment si tu l'écris
de manière un peu plus compacte :

(if (= couplets 1)
   #{
     \new ChoirStaff <<
       \new Staff { \autoBeamOff \include $(pathname "music.ly") }
       \addlyrics { \include $(pathname "paroles.ly") }
   #}
   #{
     \new ChoirStaff <<
       \new Staff { \autoBeamOff \include $(pathname "music.ly") }
       \addlyrics { \include $(pathname "paroles.ly") }
       \addlyrics { \include $(pathname "paroles2.ly") }
   #}))

Maintenant, si tu veux générer autant de \addlyrics qu'il y a de couplets,
c'est possible mais ça va pas être si clair.

Nicolas