IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scheme Discussion :

[Llilypond][Guile] Definir une liste


Sujet :

Scheme

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Points : 330
    Points
    330
    Par défaut [Llilypond][Guile] Definir une liste
    Salut,

    Je suis novice en Scheme et je n'arrive pas à déclarer une liste.

    Actuellement, je passe par ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    chordsTemplates = #'()
    
    makeChordsTemplates =
    #(define-void-function (parser location chord-symbol key-symbol pitches diagram)
        (symbol? string? string? string?)
        ""
        ;(ly:parser-define! parser key-symbol pitches)
        (set! chordsTemplates (acons chord-symbol (list key-symbol pitches diagram) chordsTemplates)))
    
    \makeChordsTemplates #'eMajorOnStringSix "e" "<e,\6 b,\5 e\4 gis\3 b\2 e'\1>" "o;2;2;1;o;o;"
    Ça fonctionne bien.
    Mais j'aimerais pouvoir déclarer ma liste sans passer par cette fonction, du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    chordsTemplates = #'(
       (#'eMajorOnStringSix . '("e" "<e,\6 b,\5 e\4 gis\3 b\2 e'\1>" "o;2;2;1;o;o;"))
    )
    Ça ne fonctionne pas, je n'arrive pas à trouver la bonne syntaxe.

    Comment devrais-je m'y prendre ?

    Merci d'avance.

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 152
    Points : 275
    Points
    275
    Par défaut
    Salut !

    Je ne suis pas utilisateur de Lilypond.

    Est-ce que eMajorOnStringSix est une fonction qui s’applique à plusieures chaînes ? Alors, tu pourrais essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chordsTemplates = #(eMajorOnStringSix "e" "<e,\6 b,\5 e\4 gis\3 b\2 e'\1>" "o;2;2;1;o;o;")

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Points : 330
    Points
    330
    Par défaut
    "eMajorOnStringSix" est un symbol. Il y aura aussi "eMinorOnStringSix" et "eMajorSeventhOnStringSix" etc.

    Le genre de chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    chordsTemplates = #'(
       ('eMajorOnStringSix . '("e" "<e,\6 b,\5 e\4 gis\3 b\2 e'\1>" "o;2;2;1;o;o;"))
       ('eMinorOnStringSix . '("e" "<e,\6 b,\5 e\4 g\3 b\2 e'\1>" "o;2;2;o;o;o;"))
       ...
    )
    Je cherche donc à définir une liste de pair de liste (Enfin, il me semble...).

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 152
    Points : 275
    Points
    275
    Par défaut
    Ça doit marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    chordsTemplates = #'(
       (eMajorOnStringSix "e" "<e,\6 b,\5 e\4 gis\3 b\2 e'\1>" "o;2;2;1;o;o;")
       (eMinorOnStringSix "e" "<e,\6 b,\5 e\4 g\3 b\2 e'\1>" "o;2;2;o;o;o;")
       ...
    )
    Si c’est ça, je vais expliquer pourquoi.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Points : 330
    Points
    330
    Par défaut
    C'était pas loin

    Les backslashes étaient avant tout fautifs. Il fallait les échapper. Ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    chordsEssaiOne = #'(
       (eMajorOnStringSix . ("e"	"<e,\\6 b,\\5 e\\4 gis\\3 b\\4 e'\\1>"	"o;2;2;1;o;o;"))
       (eMinorOnStringSix . ("e"	"<e,\\6 b,\\5 e\\4 g\\3 b\\2 e'\\1>"	"o;2;2;o;o;o;"))
    )
    
    #(ly:message (format "*EssaiOne 1* ~a\n" (list-ref (assoc 'eMajorOnStringSix chordsEssaiOne) 1) ))
    #(ly:message (format "*EssaiOne 2* ~a\n" (list-ref (assoc 'eMajorOnStringSix chordsEssaiOne) 2) ))
    #(ly:message (format "*EssaiOne 3* ~a\n" (list-ref (assoc 'eMajorOnStringSix chordsEssaiOne) 3) ))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    *EssaiOne 1* e
    *EssaiOne 2* <e,\6 b,\5 e\4 gis\3 b\4 e'\1>
    *EssaiOne 3* o;2;2;1;o;o;
    Merci pour ton aide.

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 152
    Points : 275
    Points
    275
    Par défaut
    C’est ma faute, j’ai oublié les backslashes, ils ont une signification spéciale à l’intérieur des chaînes.

    En Scheme, les expressions ont souvent la forme d’une liste. Par défaut, une expression de la forme (f a b 3) signifie que la fonction f est appliquée aux arguments a, b et 3. Ici f, a, b et 3 sont sous-expressions: 3 est un nombre litéral et f, a et b sont des variables. Évidemment, la valeur d’un nombre litéral, c’est le nombre même. Évaluer une variable, c’est renvoyer sa valeur.

    Cependent, parfois on ne veut pas évaluer une expression. Par exemple, si je veux obtenir la liste (1 2 3), je ne peux pas tout simplement écrire (1 2 3), car c’est l’application de la fonction 1 aux arguments 2 et 3. Mais c’est absurde, 1 n’est même pas une fonction. La forme spéciale quote existe pour supprimer l’évaluation. Ainsi, (quote (1 2 3)) signifie « ne pas évaluer l’expression suivante (c’est-à-dire, (1 2 3)), mais l’utiliser comme données ». Ça peut être abrégé comme '(1 2 3). Donc, le caractère ' signifie que l’expression suivante n’est pas à évaluer. Par conséquence, il ne faut pas écrire ' avant les sous-expressions: dans '(1 (2 3) (4 5)), le guillemet supprime l’évaluation de la liste entière, y compris les sous-listes.

    Ainsi, on peut utiliser le guillemet pour former des listes litérales. Un autre emploi fréquent du guillemet, c’est avant un symbole pour obtenir le symbole même au lieu de la valeur associé: 'a résulte en le symbole a, pas en la valeur de la variable a. '(1 2 ("foo" "bar") (a (b c))) est une liste litérale avec sous-listes contenant des nombres, des symboles et des chaînes.

    C’est pourquoi il ne faut qu’un guillemet avant le liste.

    Puis, en lisp, il n’y pas de listes proprément dites. Il y a des paires, dont des chaînes nous appellons listes. La paire composée de 1 et 2 est notée (1 . 2). La notation (1 2 3 4) est une abréviation de (1 . (2 . (3 . (4 . ())))), donc une chaîne des paires dont le deuxièmes éléments sont eux-mêmes paires, sauf (4 . ()), où () désigne un objet dit une liste vide. C’est pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (eMajorOnStringSix . ("e"  "<e,\\6 b,\\5 e\\4 gis\\3 b\\4 e'\\1>"  "o;2;2;1;o;o;"))
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (eMajorOnStringSix "e"  "<e,\\6 b,\\5 e\\4 gis\\3 b\\4 e'\\1>"  "o;2;2;1;o;o;")
    , c’est la même chose.

    À propos, en lisp, on préfère écrire e-major-on-string-six.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    313
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 313
    Points : 330
    Points
    330
    Par défaut
    Merci pour ces explications.
    C'est un langage assez perturbant quand on a d'autres habitudes, même si parfois il me fait penser à Objective-C, mais de très loin

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Vba definir la liste d'une combobox à partir de sources differentes
    Par yann26 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/07/2014, 06h50
  2. definir une liste de valeur a la propriété de mon composant (dll)
    Par jujupiplette dans le forum Windows Forms
    Réponses: 1
    Dernier message: 24/01/2012, 14h50
  3. Definir un nombre maximum dans une liste
    Par jjpopaul dans le forum Langage
    Réponses: 1
    Dernier message: 13/04/2010, 16h48
  4. Générer une liste
    Par pfredin dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/04/2003, 15h30
  5. tri d'une liste
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 09/01/2003, 18h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo