Subject: Re: Résolution de l'équation iScheme = infix (Scheme)

From: Jean Abou Samra <[email-masked]>
Date: Tue, 9 Aug 2022 23:27:44 +0200

Bonjour,

Presque exactement deux mois plus tard...

Le 08/06/2022 à 19:08, Christian LE BARS a écrit :
> Bonjour Jacques.
>
> J'approuve complètement ta démarche, bravo.
>
> Je suis sur que Jean va réfléchir et donner une solution.

Ce qui a fini par arriver est que Jacques posait des questions à
Jean sur la manière dont on pouvait s'y prendre, et Jean a fini par
trouver que c'était tout aussi facile de donner un exemple que de
tout expliquer verbeusement, et puis Jean s'est pris au jeu, et
cela a donné ceci :

https://gitlab.com/jeanas/herescheme/

C'est un dépôt Git. Pour ceux qui ne sont pas à l'aise avec Git,
il suffit de télécharger le code dans un archive .zip avec le bouton
« Download » qui est dessiné par une flèche vers le bas, vers le haut
à droite de la page. Ou bien utiliser ce lien direct :

https://gitlab.com/jeanas/herescheme/-/archive/main/herescheme-main.zip

Plus qu'à dézipper, mettre ça quelque part sur votre ordinateur, et
\include le fichier "/.../herescheme/herescheme.ily".

Le README.md (que l'on peut lire sur la page du dépôt) contient une
explication de chaque élément de la syntaxe. C'est en anglais pour
l'instant. Lien direct :

https://gitlab.com/jeanas/herescheme/#usage

Le fichier herescheme-examples.ily contient un certain nombre d'exemples.

En voici un pour conclure, tiré de herescheme-examples.ily, qui correspond
à l'exemple que donnait Jacques dans son post de départ avec quelques 
ajouts :

\relative c' {
   \shape &"[(0, 0), (0, 1.5), (0, 0.4), (0, 0)]" Slur
   \override Beam.grow-direction =
     &"function(beam) =>
         let Y_positions = ly.grob_property(beam, |positions|) in
         {
           ly.message('Beam \\'positions are ~a', Y_positions);
           let left_position = car(Y_positions) in
           let right_position = cdr(Y_positions) in
           if left_position < right_position then {
             RIGHT
           }
           else if left_position > right_position then  {
             LEFT
           }
           else if left_position = right_position then {
             CENTER
           }
           else ly.error('this can\\'t happen')
         }"
   c'16( d e f g f e d c g c g c e g c)
}

Je tiens à préciser que tout ceci est hautement expérimental. Les 
commentaires
sont fortement les bienvenus, en revanche je recommande d'attendre un peu
avant de l'utiliser sérieusement dans une partition.

Je n'ai à vrai dire aucune idée de l'utilité de ce projet ou du futur
qui peut l'attendre, je suis surtout curieux de voir. D'un côté, toute la
documentation LilyPond, tous les tutoriels Scheme, les manuels de Guile,
les snippets fournis sur les listes, et aussi l'affichage des valeurs dans
la console utilisent la syntaxe Scheme normale, donc il n'est pas 
question de
l'oublier. Ne faire qu'avec le Herescheme sans connaître la syntaxe Scheme
usuelle risque d'être compliqué. D'un autre côté, j'ai vu un certain
nombre de personnes qu'écrire du Scheme rebute à cause des nombreuses
parenthèses et de la syntaxe préfixe. Si cela peut aider ces personnes à
prendre en main le Scheme, pourquoi pas après tout. Deux précisions pour
finir. 1° On peut mélanger à volonté le Scheme et le Herescheme, et
donc choisir par exemple de n'écrire que les opérations mathématiques en
Herescheme. 2° Herescheme n'est absolument pas un nouveau langage de 
programmation,
simplement une syntaxe qui permet d'écrire du Scheme différemment. Il ne
faut pas s'attendre à retrouver Java, Python ou autre. En particulier,
il faudra comprendre à peu près les mêmes concepts d'écriture des 
programmes,
comme le style fonctionnel. Par contre, la syntaxe est plus habituelle pour
un œil qui n'est pas familier des langages de la famille Lisp.

Cordialement,
Jean