Subject: vecteur scheme

From: Daniel Cartron <[email-masked]>
Date: Fri, 17 May 2013 08:48:10 +0200

Bonjour,

Toute la doc que je trouve sur scheme s'adresse manifestement à des 
programmeurs patentés, ce qui fait que je ne comprend pas grand-chose...

Je pense que les vecteurs pourraient répondre à mon besoin mais j'ai qq 
questions.

Est-ce que ce qui suit définit bien un vecteur ?

(define cta
        (vector 
                '(0 0  1/2 1 1 1)
                '(1 0  1/2 2 1 1)
                '(6 0 -1/2 1 2 1)
                '(4 0  1/2 2 2 1)
        )
)

Je voudrais que la valeur 6 0 -1/2 1 me renvoie 2 1, ça le fera ?

Les valeurs  6 0 -1/2 sont celles du pitch de la note et le 1 qui suit la 
valeur de StringNumberEvent, vais-je pouvoir les récupérer sous cette forme et 
comment ?

Merci

-- 
Cordialement, Daniel Cartron
« Ô privilège du génie ! Lorsqu'on vient d'entendre un morceau de Mozart, le 
silence qui lui succède est encore de lui. »
Sacha Guitry - Toutes réflexions faites

---

From: Daniel Cartron <[email-masked]>
Date: Fri, 17 May 2013 10:21:38 +0200

> Est-ce que ce qui suit définit bien un vecteur ?

je me répond moi mm : oui, j'ai ouvert un interpréteur guile (je sais pas si 
on dit comme ça mais bon un terminal où j'ai guile> qui attend des commandes) 
et ça c'est bon

> Je voudrais que la valeur 6 0 -1/2 1 me renvoie 2 1, ça le fera ?

j'ai trouvé que c'est vector-ref qui fait ça mais impossible de m'en servir, 
j'arrive pas à trouver la bonne syntaxe

Voilà ça réduit un peu le champ de ma question

-- 
Cordialement, Daniel Cartron
« Sans alcool pas de lucidité. »
Serge Gainsbourg

---

From: Gilles <[email-masked]>
Date: Fri, 17 May 2013 15:28:32 +0200

> j'arrive pas à trouver la bonne syntaxe
Quand tu écrits :
(define cta
         (vector
                 '(0 0  1/2 1 1 1)
                 '(1 0  1/2 2 1 1)
                 '(6 0 -1/2 1 2 1)
                 '(4 0  1/2 2 2 1)
         ))
tu crées un vecteur composé de 4 listes.
Est-ce que ce n'est pas plutôt une liste composée de 4 vecteurs que tu  
veux ?

(define cta
         (list (vector 0 0  1/2 1 1 1)
               (vector 1 0  1/2 2 1 1)
               (vector 6 0 -1/2 1 2 1)
               (vector 4 0  1/2 2 2 1)
         ))

On accède à un élément de la liste avec list-ref
   (list-ref cta 2) pour le 3ème élément (ça commence à 0)
Une fois récupéré cet élément, tu peux effectivement naviguer à  
l'intérieur de cet élément avec vector-ref

-- 
Gilles

---

From: Gilles <[email-masked]>
Date: Fri, 17 May 2013 15:28:31 +0200

> programmeurs patentés, ce qui fait que je ne comprend pas grand-chose...
Il faut aller trifouiller la doc ici :
http://www.gnu.org/software/guile/manual/guile.html#API-Reference
Pour les vector
http://www.gnu.org/software/guile/manual/guile.html#Vectors

-- 
Gilles

---

From: Daniel Cartron <[email-masked]>
Date: Fri, 17 May 2013 16:13:28 +0200

> http://www.gnu.org/software/guile/manual/guile.html#Vectors

c'est la doc que j'ai trouvé, je la trouve très succincte...

> Est-ce que ce n'est pas plutôt une liste composée de 4 vecteurs que tu  

c'était justement ce que j'étais en train de tester pour voir et en plus ça me 
permet de concaténer plusieurs listes, avec
(define cte
 (append
  base_do
  base_sol
  cta
 )
)
par exemple, ce qui est exactement ce que je cherchais à faire.

> l'intérieur de cet élément avec vector-ref

mon problème est que je ne sais pas quel élément je cherche. Dans ma liste de 
vecteurs il y a plusieurs vecteurs qui auront le mm premier élément. Par 
exemple plusieurs 6 ou plusieurs 4 mais ayant chacun des valeurs différentes 
pour la suite du vecteur. En fait je cherche à retrouver le vecteur dont je 
connais les éléments 1 2 3 et 4 ou 1 2 3 et 5, il y a deux approches 
possibles, pour récupérer les valeurs 5 et 6. Il ne peut pas y avoir de 
doublons; les valeurs 4 et 5 s'excluent mutuellement, mais il y peut y avoir 
des doublons sur 1 2 3 4 mais jamais sur 1 2 3 5. J'espère que c'est pas trop 
confus...

Donc une liste composée de vecteurs est-elle bien la bonne solution ?

Merci

-- 
Cordialement, Daniel Cartron
« La laideur a ceci de supérieur à la beauté, c'est qu'elle dure! »
Georg Christoph Lichtenberg

---

From: Daniel Cartron <[email-masked]>
Date: Fri, 17 May 2013 16:49:50 +0200

> > l'intérieur de cet élément avec vector-ref

et parmi tous les car, cdr, caar, cadr, cdar, cddr, caaar, caadr, cadar, 
caddr, cdaar, cdadr, cddar, cdddr, caaaar, caaadr, caadar, caaddr, cadaar, 
cadadr, caddar, cadddr, cdaaar, cdaadr, cdadar, cdaddr, cddaar, cddadr, 
cdddar, cddddr yen a pas un qui pourrait faire l'affaire ?

ma liste :

(define cte
 (list
  (list 6 -1 0 2 2 2)
  (list 4 -1 0 1 2 2)
  (list 0 0 0 1 2 3)
  (list 1 0 0 2 2 3)
  (list 2 0 0 1 2 4)
  (list 3 0 0 2 2 4)
  (list 5 0 0 2 2 5)
  (list 4 0 0 1 2 5)
  (list 6 0 0 2 2 6)
  (list 0 1 0 1 2 6)
  (list 1 1 0 2 2 7)
  (list 2 1 0 1 2 7)
  (list 3 1 0 2 2 8)
  (list 4 1 0 1 2 8)
  (list 5 1 0 2 2 9)
  (list 0 2 0 1 2 9)
  (list 6 1 0 2 2 10)
  (list 2 2 0 1 2 10)
  (list 1 0 0 1 1 2)
  (list 3 1/2 0 2 1 2)
  (list 5 0 0 2 1 3)
  (list 4 0 0 1 1 3)
  (list 6 0 0 1 1 4)
  (list 0 1 0 2 1 4)
  (list 1 0 0 1 1 5)
  (list 2 1 0 2 1 5)
  (list 3 1 1/2 2 1 6)
  (list 4 1 0 1 1 6)
  (list 5 1 0 2 1 7)
  (list 6 1 0 1 1 7)
  (list 0 2 0 2 1 8)
  (list 1 1 0 1 1 8)
  (list 2 2 0 2 1 9)
  (list 4 1 0 1 1 9)
  (list 6 2 0 1 1 10)
  (list 3 2 1/2 2 1 10)
  (list 5 3 0 2 1 11)
  (list 1 2 0 1 1 11)
  (list 0 0  1/2 1 1 1)
  (list 1 0  1/2 2 1 1)
  (list 6 0 -1/2 1 2 1)
  (list 4 0  1/2 2 2 1)
 )
)

pour un vecteur a b c d e f je cherche à récupérer d e f pour (par exemple)
a b c = 4 1 0  (deux réponses) et ensuite je choisis en fonction du fait que 
je connais soit d ou e
ou alors si je connais soit d soit e je cherche directement a b c - e ou a b 
c d ? 
Je ne vois pas encore ce qui sera le plus simple à faire...

-- 
Cordialement, Daniel Cartron
« Le capitalisme, c'est l'exploitation de l'homme par l'homme. Le 
communisme, c'est le contraire. »
Arthur Koestler

---

From: Daniel Cartron <[email-masked]>
Date: Fri, 17 May 2013 20:35:26 +0200

Le vendredi 17 mai 2013 16:49:50 Daniel Cartron a écrit :
> a b c = 4 1 0  (deux réponses) et ensuite je choisis en fonction du fait
> que  je connais soit d ou e
> ou alors si je connais soit d soit e je cherche directement a b c - e ou a
> b  c d ?

À la réflexion je me dis que le mieux c'est de ne faire la recherche que sur 
"a b c" et récupérer la ou les valeurs possibles de "d e f", normalement c'est 
1 ou 2, peut-être 3 mais ce sera rare, stocker ces valeurs dans des variables, 
puis, si j'ai une valeur de d ou e discriminante ça sera traité a posteriori, 
ces cas seront peu fréquents (je dirais à la louche moins de 25%). Mais je dis 
ça sans comprendre vraiment le fonctionnement de scheme...

-- 
Cordialement, Daniel Cartron
« Pour être heureux avec les êtres, il ne faut leur demander que ce qu'ils 
peuvent donner. »
Tristan Bernard

---

From: Gilles <[email-masked]>
Date: Sat, 18 May 2013 00:26:12 +0200

> cdddar, cddddr yen a pas un qui pourrait faire l'affaire ?

Tu peux essayer de copier ça dans un fichier test.ly par exemple, puis  
compiler

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#(define cte
    (list
     (list 6 -1 0 2 2 2)
     (list 4 -1 0 1 2 2)
     (list 0 0 0 1 2 3)
     (list 1 0 0 2 2 3)
     (list 2 0 0 1 2 4)
     (list 3 0 0 2 2 4)
     (list 5 0 0 2 2 5)
     (list 4 0 0 1 2 5)
     (list 6 0 0 2 2 6)
     (list 0 1 0 1 2 6)
     (list 1 1 0 2 2 7)
     (list 2 1 0 1 2 7)
     (list 3 1 0 2 2 8)
     (list 4 1 0 1 2 8)
     (list 5 1 0 2 2 9)
     (list 0 2 0 1 2 9)
     (list 6 1 0 2 2 10)
     (list 2 2 0 1 2 10)
     (list 1 0 0 1 1 2)
     (list 3 1/2 0 2 1 2)
     (list 5 0 0 2 1 3)
     (list 4 0 0 1 1 3)
     (list 6 0 0 1 1 4)
     (list 0 1 0 2 1 4)
     (list 1 0 0 1 1 5)
     (list 2 1 0 2 1 5)
     (list 3 1 1/2 2 1 6)
     (list 4 1 0 1 1 6)
     (list 5 1 0 2 1 7)
     (list 6 1 0 1 1 7)
     (list 0 2 0 2 1 8)
     (list 1 1 0 1 1 8)
     (list 2 2 0 2 1 9)
     (list 4 1 0 1 1 9)
     (list 6 2 0 1 1 10)
     (list 3 2 1/2 2 1 10)
     (list 5 3 0 2 1 11)
     (list 1 2 0 1 1 11)
     (list 0 0  1/2 1 1 1)
     (list 1 0  1/2 2 1 1)
     (list 6 0 -1/2 1 2 1)
     (list 4 0  1/2 2 2 1)
    )
)

#(let ((elt (list-ref cte 2))) ; = le 3ème elt de cte
     (display (list-ref elt 3))(newline) ;  = le 4ème elt du 3ème elt de cte
     (display (list-ref elt 4))(newline) ; = le 5ème etc
     (display (list-ref elt 5))(newline))
     % => affiche 1, puis 2 puis 3

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Pour cte, on est obligé de passer par list-ref, à cause du nombre élevé  
d'éléments.
Par contre, comme chaque elt de cte est une liste de 6 elts, tu peux
utiliser
    first, second, third, fourth, fifth, sixth, comme défini ici :
http://www.gnu.org/software/guile/manual/guile.html#SRFI_002d1-Selectors
[Le module SRFI-1 est déjà chargé par Lilypond, on a rien à faire de  
particulier]
Ca clarifie un peu les choses :

#(let ((elt (list-ref cte 2))) ; = le 3ème elt de cte
     (display (fourth elt))(newline) ; = le 4ème elt du 3ème elt de cte
     (display (fifth elt))(newline)  ; = le 5ème etc
     (display (sixth elt))(newline))

-- 
Gilles

---

From: Daniel Cartron <[email-masked]>
Date: Sat, 18 May 2013 09:03:07 +0200

> Pour cte, on est obligé de passer par list-ref, à cause du nombre élevé  

Le pb est que je ne connais pas le numéro de l'élément que je veux récupérer, 
uniquement la triplette a b c - en fait c'est le contenu du pitch tel qu'on 
peut le voir avec \displayMusic : (ly:make-pitch 3 1/2 0))

Et en plus il y a quasiment toujours au moins deux résultats possibles.

Bon sinon ton code affiche bien le bon résultat.

-- 
Cordialement, Daniel Cartron
« L'humanité a l'oreille ainsi faite qu'elle continue à dormir quand le bruit 
retentit et ne se réveille qu'avec l'écho. »
Arthur Schnitzler

---

From: Daniel Cartron <[email-masked]>
Date: Sat, 18 May 2013 11:49:26 +0200

> Pour cte, on est obligé de passer par list-ref, à cause du nombre élevé  

et map-in-order ? ça semble idéal...

http://www.gnu.org/software/guile/manual/guile.html#List-Searching

je vais me faire un petit test avec ça... et je te dirai

-- 
Cordialement, Daniel Cartron
«  Il faut exiger de chacun ce que chacun peut donner. »
Antoine de Saint-Exupéry - Le petit prince