Comment fait-on pour écrire une fonction qui retourne plusieurs valeurs comme dans cet exemple :
200 étant la largeur et 300 la hauteur.Code:
1
2
3
4 >(send maFenetre get-size) 200 300 >
Version imprimable
Comment fait-on pour écrire une fonction qui retourne plusieurs valeurs comme dans cet exemple :
200 étant la largeur et 300 la hauteur.Code:
1
2
3
4 >(send maFenetre get-size) 200 300 >
Salut
Ma question n'ayant pas passionné les foules, je ne sais pas si la réponse intéressera aussi. :cry:
Dans cet exemple je cherche à extraire les informations d'un fichier txt au format CSV (5 champs séparés par un ';')
Voici un exemple d'appelCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 ;; cette fonction extrait un champ d'une chaîne de caractères ;; et renvoie une liste formée de 2 chaînes de caractères (ou une seule en fin de ligne) ;; exemple (get-un-champs "ab;cd;ef" #\; ) => ("ab" "cd;ef") (define (get-champs ll sep) (let* ((x ()) (str ll) (i1 (string-index str sep))) (if (not (eq? i1 #f)) (list (substring str 0 i1) (substring str (+ i1 1))) (list str)))) ;; cette fonction extrait les différents champs d'une chaîne de caractères ;; le letrec-values permet de mémoriser les résultats des appels à get-un-champs ;; l'évaluation est séquentielle c'est-à-dire qu'on peut utiliser dans y le résultat obtenu dans x ;; values permet de renvoyer les différentes valeurs (define (get-champs ll sep) ;; après remarque sur un forum spécialisé j'ai modifié le letrec-value en let* (let* ((x (get-un-champs ll sep)) (y (get-un-champs(cadr x) sep)) (z (get-un-champs (cadr y) sep)) (t (get-un-champs (cadr z) sep)) (u (get-un-champs (cadr t) sep))) (values (car x) (car y) (car z) (car t) (car u))))
En supposant défini un objet "article" on peut ainsi construire une liste d'objetsCitation:
> (get-champs "ab;cd;ef" #\; )
"ab"
"cd"
"ef"
Je pense donc mettre :resolu: mais je suis intéressé par toute autre méthode possible.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 (define (make-list-objects) (let* ((fin (open-input-file "fichier.txt")) ;; on definit une fonction locale qui va se charger de fabriquer un article ;; à partir de la ligne du fichier CSV (x (let lecture-fic ((f fin)) (let ((str (read-line f))) (if (not (eof-object? str)) (letrec-values (((c1 c2 c3 c4 c5) (get-champs str #\;))) (cons (make-article c1 c2 c3 c4 c5) (lecture-fic f) ) ) () )) ) ) ) (close-input-port fin) x ) )