Erreur SRFI-13 sur snippet addFingering en version 2.23

Bonjour !
J'aime me servir de ce snippet pour les doigtés, mais depuis la version 2.23 le journal râle en disant
"Guile used to use the wrong argument order for string-delete.
This call to string-filter had the arguments in the wrong order.
See SRFI-13 for more details. At some point we will remove this hack."...
Ca fonctionne malgré tout mais est-ce grave docteur ?
En effet je l'ai pas mal utilisé et aimerais encore le faire, donc croyez-vous qu'il sera encore utilisable pour la prochaine version stable ou pas ?
Gilles

\version "2.23.13"

%% http://lsr.di.unimi.it/LSR/Item?id=768
%% see also http://lilypond.org/doc/v2.18/Documentation/notation/common-notation-for-fretted-strings

%LSR by Gilles Thibault
%% file version : 16\07\2011

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% LSR workaround:
#(set! paper-alist (cons '("snippet" . (cons (* 150 mm) (* 100 mm))) paper-alist))
\paper {
#(set-paper-size "snippet")
tagline = ##f
indent = 25
}
\markup\vspace #.5
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% snippet starts here:

deleteArticulations = #(define-music-function (music) (ly:music?)
(music-filter
(lambda (evt)
(not (memq (ly:music-property evt 'name) (list 'FingeringEvent
'StrokeFingerEvent
'StringNumberEvent))))
music))

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

#(define (name-of music)
(ly:music-property music 'name))

#(define (delete-comments s)
"Delete in a string, all substrings begining with % bis the end of line."
(let ((delete? #f)
(prev-char #\a))
(string-delete s
(lambda (c)
(case c
((#\%)
(if (not (char=? prev-char #\nul))
(set! delete? #t)))
((#\newline)(set! delete? #f)))
(set! prev-char c)
delete?))))

#(define (expand-chars s)
"Transforme in a string, *15x for example, in xxxxxxxxxxxxxxx (15 times)"
(let ((len (string-length s))
(star-pos #f)
(count-str ""))
(if (> len 0)
(let loop ((i 0))
(let ((c (string-ref s i))
(reset (lambda ()
(set! star-pos #f)
(set! count-str ""))))
(cond
((eq? c #\*) (set! star-pos i))
((char-numeric? c)
(if star-pos (set! count-str (string-append count-str (string c)))))
((char-alphabetic? c)
(if star-pos (if (string-null? count-str)
(reset)
(let* ((count (string->number count-str))
(replace-str (make-string count c)))
(set! s (string-replace s replace-str star-pos (1+ i)))
(set! len (string-length s))
(set! i (+ star-pos count))
(reset)))))
(else (if star-pos (reset)))))
(if (< i (1- len)) (loop (1+ i)))))
s))

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% general methode for adding articulations.
%% event-name : articulation event name : 'FingeringEvent for ex.
%% property-name : main property of event-name : 'digit for fingerings.
%% min max : range number for a digit : 0-5 for fingerings.
#(define (add-articulation event-name property-name min max music finger-str)
(let* ((my-char-set (char-set-adjoin char-set:letter+digit #\+ #\- #\'))
(pre-str (expand-chars (delete-comments finger-str)))
(str-list (string->list pre-str))
(str-list-filtered->char (lambda ()
(define (loop)
(let ((c (car str-list)))
(if (char-set-contains? my-char-set c)
c
(begin (set! str-list (cdr str-list))
(if (null? str-list) #\nul (loop))))))
(loop)))
(current-char (if (null? str-list) #\nul (str-list-filtered->char)))
(next-char (lambda (filter?)(set! current-char
(if (or (null? str-list)
(begin (set! str-list (cdr str-list))
(null? str-list)))
#\nul
(if filter? (str-list-filtered->char)
(car str-list)))))))
(define (set-dir dir); "+" return 1, "-" return -1. To call with (set-dir 0).
(cond ((char=? current-char #\+)
(next-char #t)
(set-dir 1))
((char=? current-char #\-)
(next-char #t)
(set-dir -1))
(else dir)))
(music-map
(lambda (evt)
(if (and (eq? (name-of evt) 'NoteEvent)
(pair? str-list))
(let*((dir (set-dir 0))
(tweaks? (and
(char=? current-char #\') ; section between 2 apostrophes ?
(let loop ((text-list '())
(prev-char current-char))
(next-char #f)
(let*((apostrophe? (char=? current-char #\'))
(escaped-char? (and (or apostrophe?
(char=? current-char #\%))
(char=? prev-char #\nul))))
(cond
(escaped-char?
(loop (cons current-char (cdr text-list))
current-char))
((or apostrophe? (null? str-list)) ; close section
(list (cons
(quote text)
(reverse-list->string text-list))))
(else (loop (cons current-char text-list)
current-char)))))))
(i (if tweaks? min (- (char->integer current-char)
(char->integer #\0))))
(tweaks (if tweaks? tweaks? '())))
(if (and (>= i min)(<= i max))
(ly:music-set-property! evt 'articulations (append
(list (make-music
event-name
'tweaks tweaks
'direction dir
property-name i ))
(ly:music-property evt 'articulations))))
(next-char #t)))
evt)
music)))

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% addFingering adds the first digit founded in fingerStr, adds
%% it as a fingering to the first note found in music and so on.
%% Just enter a letter if you don't want fingering for certain notes.
%% You can also
%% -> add a direction ("+" = UP,"-" = DOWN).
%% -> add a substitution fingering by enclosing several digits between 2
%% apostrophes, with - (minus) as separator char, like that '1-2-3'.
%% -> add comments at the end of the line. Start them with a percent sign (%).

addFingering = #(define-music-function (music fingerStr)
(ly:music? string?)
(add-articulation 'FingeringEvent 'digit 0 5 music fingerStr))

addStrokeFinger = #(define-music-function (music fingerStr)
(ly:music? string?)
(add-articulation 'StrokeFingerEvent 'digit 1 4 music fingerStr))

addStringNumber = #(define-music-function (music fingerStr)
(ly:music? string?)
(add-articulation 'StringNumberEvent 'string-number 0 9 music fingerStr))

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% \include "extractMusic.ly"
%% Download extractMusic.ly here : http://gillesth.free.fr/Lilypond/extractMusic/

music = \relative c' { c4 d <e g> <f a> g f <e g> <d f> c b a b <c e g c>1}
musicWithFinger = \addFingering \music
#"012345 % mes 1
xxxx '1-2''3-4' % mes 2
-1+2-3+4 % mes 3
1234 % mes 4
"
%% To use \multiReplaceMusic, download "extractMusic.ly" .
%{
musicWithFingerAndOverrides = \multiReplaceMusic \musicWithFinger {
\once \set fingeringOrientations = #'(down right) s2. %% = 4th beats
\once \set fingeringOrientations = #'(down left up) s1*3 %% 4th measures
}
%}

\score {<<
\new Staff \with { instrumentName = \markup \center-column
{ "original""music" }}
\music
\new Staff \with { instrumentName = \markup \center-column
{"music with""left hand""fingerings"}}
\musicWithFinger
% \new Staff \with { instrumentName = \markup \center-column
% {"fingerings""+""overrides"}}
% \musicWithFingerAndOverrides
%% To test \addStringNumber and \addStrokeFinger

\new Staff \with { instrumentName = \markup \center-column
{"music with""string number"}}
\addStringNumber \music
#"012345 % mes 1
xxxx '10''11' % mes 2 for more than 10 strings.
-1+2-3+4 % mes 3
1234 % mes 4
"
\new Staff \with { instrumentName = \markup \center-column
{"music with""right hand" "fingerings"}}
\addStrokeFinger \music
#"123432 % mes 1
xxxx 'pouce''index' % mes 2
-1+2-3+4 % mes 3
'd''z''m''r' % mes 4
"

···

}

Rien de très méchant. Vers le début du snippet, il suffit de remplacer

#(define (delete-comments s)
"Delete in a string, all substrings begining with % bis the end of line."
(let ((delete? #f)
(prev-char #\a))
(string-delete s
(lambda (c)
(case c
((#\%)
(if (not (char=? prev-char #\nul))
(set! delete? #t)))
((#\newline)(set! delete? #f)))
(set! prev-char c)
delete?))))

par

#(define (delete-comments s)
"Delete in a string, all substrings begining with % bis the end of line."
(let ((delete? #f)
(prev-char #\a))
(string-delete
(lambda (c)
(case c
((#\%)
(if (not (char=? prev-char #\nul))
(set! delete? #t)))
((#\newline)(set! delete? #f)))
(set! prev-char c)
delete?)
s)))

et Guile sera content. Le snippet ne marchera simplement plus en
version 2.22, car la 2.22 utilise Guile 1, qui n'acceptait pas
encore cela.

Même si tu ne fais pas cette modification, le snippet devrait continuer
à fonctionner en 2.24 avec le même avertissement, car la 2.24 utilisera
toujours Guile 2, comme les 2.23 récentes.

Il n'est pas impossible qu'en 2.25 on finisse par passer à Guile 3,
auquel cas la modification deviendra vraiment nécessaire.

Cordialement,
Jean

···

Le 22/09/2022 à 13:45, Ya Gloops a écrit :

Bonjour !
J'aime me servir de ce snippet pour les doigtés, mais depuis la version 2.23 le journal râle en disant
"Guile used to use the wrong argument order for string-delete.
This call to string-filter had the arguments in the wrong order.
See SRFI-13 for more details. At some point we will remove this hack."...
Ca fonctionne malgré tout mais est-ce grave docteur ?
En effet je l'ai pas mal utilisé et aimerais encore le faire, donc croyez-vous qu'il sera encore utilisable pour la prochaine version stable ou pas ?

Trop fort Jean !
Merci beaucoup...

Bonjour !
J'aime me servir de ce snippet pour les doigtés, mais depuis la version 2.23 le journal râle en disant
"Guile used to use the wrong argument order for string-delete.
This call to string-filter had the arguments in the wrong order.
See SRFI-13 for more details. At some point we will remove this hack."...
Ca fonctionne malgré tout mais est-ce grave docteur ?
En effet je l'ai pas mal utilisé et aimerais encore le faire, donc croyez-vous qu'il sera encore utilisable pour la prochaine version stable ou pas ?

Rien de très méchant. Vers le début du snippet, il suffit de remplacer

#(define (delete-comments s)
"Delete in a string, all substrings begining with % bis the end of line."
(let ((delete? #f)
(prev-char #\a))
(string-delete s
(lambda (c)
(case c
((#\%)
(if (not (char=? prev-char #\nul))
(set! delete? #t)))
((#\newline)(set! delete? #f)))
(set! prev-char c)
delete?))))

par

#(define (delete-comments s)
"Delete in a string, all substrings begining with % bis the end of line."
(let ((delete? #f)
(prev-char #\a))
(string-delete
(lambda (c)
(case c
((#\%)
(if (not (char=? prev-char #\nul))
(set! delete? #t)))
((#\newline)(set! delete? #f)))
(set! prev-char c)
delete?)
s)))

et Guile sera content. Le snippet ne marchera simplement plus en
version 2.22, car la 2.22 utilise Guile 1, qui n'acceptait pas
encore cela.

Même si tu ne fais pas cette modification, le snippet devrait continuer
à fonctionner en 2.24 avec le même avertissement, car la 2.24 utilisera
toujours Guile 2, comme les 2.23 récentes.

Il n'est pas impossible qu'en 2.25 on finisse par passer à Guile 3,
auquel cas la modification deviendra vraiment nécessaire.

Cordialement,
Jean

···

Le vendredi 23 septembre 2022 à 09:54:12 UTC+2, Jean Abou Samra <****@****> a écrit :
Le 22/09/2022 à 13:45, Ya Gloops a écrit :

Merci beaucoup Jean !

Rien de très méchant. Vers le début du snippet, il suffit de remplacer

(string-delete s (lambda(c) ...)
par
(string-delete (lambda(c) ...) s)

Est-ce que à l'instar de Lilypond avec convert-ly, Guile fournit un convertisseur de
version 1.8 vers 2.x ?
Je suppose que non :frowning:

Est-ce qu'il y a au moins quelque part une liste des fonctions Guile qui ont changé de syntaxe ?

Récemment j'ai voulu utilisé string-filter
L'aide me disait
  (string-filter pred str)
alors qu'avec lilypond 2.22 la syntaxe était :
  (string-filter str pred)
J'ai mis longtemps à comprendre...

···

--
Gilles

Merci beaucoup Jean !

Rien de très méchant. Vers le début du snippet, il suffit de >
   (string-delete s (lambda(c) ...)
par
  (string-delete (lambda(c) ...) s)

Est-ce que à l'instar de Lilypond avec convert-ly, Guile fournit un convertisseur de
version 1.8 vers 2.x ?
Je suppose que non :frowning:

Est-ce qu'il y a au moins quelque part une liste des fonctions Guile qui ont changé de syntaxe ?

Récemment j'ai voulu utilisé string-filter
L'aide me disait
  (string-filter pred str)
alors qu'avec lilypond 2.22 la syntaxe était :
  (string-filter str pred)
J'ai mis longtemps à comprendre...

Merci beaucoup Jean !

> Rien de très méchant. Vers le début du snippet, il suffit de
> >
> (string-delete s (lambda(c) ...)
> par
> (string-delete (lambda(c) ...) s)

Est-ce que à l'instar de Lilypond avec convert-ly, Guile fournit un
convertisseur de
version 1.8 vers 2.x ?
Je suppose que non :frowning:

Non, ce serait trop beau. Surtout pour un langage
de programmation aussi flexible que Scheme, ce n'est
pas possible du tout.

Est-ce qu'il y a au moins quelque part une liste des fonctions Guile qui
ont changé de syntaxe ?

Récemment j'ai voulu utilisé string-filter
L'aide me disait
(string-filter pred str)
alors qu'avec lilypond 2.22 la syntaxe était :
(string-filter str pred)
J'ai mis longtemps à comprendre...

Il y a l'historique des modifications par version, qui peut
se trouver ici :

https://git.savannah.gnu.org/cgit/guile.git/tree/NEWS

En descendant, tu retrouveras les changements des versions
des séries 2.0 et 2.2.

Ce n'est pas complet apparemment, je vois que ce changement
de string-filter n'y est pas. Comme tu le constateras,
c'est aussi très dense ... (Ce n'est pas pour rien que la
transition a pris dix ans pour LilyPond.)

Je pense que les changements les plus visibles pour un utilisateur
de LilyPond sont ceux-ci :

- La fonction format attend un booléen ou un port comme premier
  argument. Au lieu de (format "xyz ~a" truc), il faut faire
  (format #f "xyz ~a" truc).

- Les règles sur le placement des define sont devenus plus strictes.
  Par exemple, on ne peut plus faire

  (if condition
      (define x 'truc)
      (define x 'bidule))

  Dans ce cas précis, il faut faire

  (define x (if condition 'truc 'bidule))

Cela étant dit, d'expérience, les soucis ne proviennent pas
principalement des changements les plus visibles, mais de
la myriade de changements à des fonctions et macros moins utilisées.
Là, il n'y a pas trente-six solutions, sauf à connaître par
cœur la liste des mille modifications documentées ou non : il faut
exécuter son code et voir ce qui se passe.

Guile 2 a aussi apporté des changements majeurs en termes
d'infrastructure puisqu'il faut désormais précompiler le
code pour qu'il soit raisonnablement rapide, mais pour l'instant
LilyPond ne précompile pas le code dans les fichier .ly car
la rapidité d'exécution n'est pas essentielle et la compilation
elle-même prend du temps, sachant que pour un fichier .ly,
on ne peut pas stocker le code précompilé dans un fichier séparé
comme pour un fichier normal .scm. (Cela dit, il y aura bientôt
une option pour compiler quand même, ce qui donnera de meilleurs
messages d'erreurs.)

Le système de macros a également été modifié de façon radicale,
mais je ne pense pas que ce soit très problématique pour les
utilisateurs de LilyPond étant donné que peu définissent leurs
propres macros. (C'était par contre difficile à vivre pour
le code de LilyPond elle-même.)

Bref, je peux parler pendant des heures des complications liées
à Guile 2, mais pour faire court, il faut juste tester son code
et lire les messages d'erreurs s'ils surviennent.

Cordialement,
Jean

···

Le 06/10/2022 11:36 CEST, Gilles Thibault <****@****> a écrit :

Il y a l'historique des modifications par version, qui peut
se trouver ici :

https://git.savannah.gnu.org/cgit/guile.git/tree/NEWS

Ah très bien ! C'est le genre de chose que je cherchais.
Merci

Ce n'est pas complet apparemment, je vois que ce changement
de string-filter n'y est pas.
Comme tu le constateras, c'est aussi très dense ...

... et en plus il y a des oublis apparemment donc ! :slight_smile:

- La fonction format attend un booléen ou un port comme premier
  argument. Au lieu de (format "xyz ~a" truc), il faut faire
  (format #f "xyz ~a" truc).

Dans Lilypond 2.22, ça par contre c'est déjà le cas je crois.

- Les règles sur le placement des define sont devenus plus strictes.
  Par exemple, on ne peut plus faire
  (if condition
      (define x 'truc)
      (define x 'bidule))

  Dans ce cas précis, il faut faire

  (define x (if condition 'truc 'bidule))

Cette info va m'être très utile car j'avais en fait déjà essayé de tester la 2.23
et j'étais tombé sur pleins d'erreurs de ce type que je ne comprenais pas.

Là, il n'y a pas trente-six solutions, sauf à connaître par
cœur la liste des mille modifications documentées ou non : il faut
exécuter son code et voir ce qui se passe.

Je pense que je vais passer à la 2.23 dans une dizaine de jours car le gros projet qui m'empêchait de sauter le pas touche à sa fin.

Encore merci Jean pour cette réponse longue et détaillée.

···

--
Gilles

Bonsoir Gilles,

- La fonction format attend un booléen ou un port comme premier
argument. Au lieu de (format "xyz ~a" truc), il faut faire
(format #f "xyz ~a" truc).

Dans Lilypond 2.22, ça par contre c'est déjà le cas je crois.

En 2.22, avec Guile 1, le #f est facultatif. En 2.23,
avec Guile 2, il devient obligatoire.

- Les règles sur le placement des define sont devenus plus strictes.
Par exemple, on ne peut plus faire
(if condition
(define x 'truc)
(define x 'bidule))

Dans ce cas précis, il faut faire

(define x (if condition 'truc 'bidule))

Cette info va m'être très utile car j'avais en fait déjà essayé de tester la 2.23
et j'étais tombé sur pleins d'erreurs de ce type que je ne comprenais pas.

Là, il n'y a pas trente-six solutions, sauf à connaître par
cœur la liste des mille modifications documentées ou non : il faut
exécuter son code et voir ce qui se passe.

Je pense que je vais passer à la 2.23 dans une dizaine de jours car le gros projet qui m'empêchait de sauter le pas touche à sa fin.

Encore merci Jean pour cette réponse longue et détaillée.

De rien, j'ai été dans la même situation. N'hésite pas à demander
de l'aide sur la liste si tu tombes sur un os.

Cordialement,
Jean

···

Le 06/10/2022 à 15:51, Gilles Thibault a écrit :