J'ai copié sur le cours une fonction d'affichage et une définition d'arbre.
J'ai écrit deux fonctions paragraphe et lignes. Ces deux fonctions pris indépendemment fonctionnent mais lorsque je les branche sur la fonction affichage je me plante. Impossible de trouver pourquoi, le trace ne me permets pas de voir l'erreur. Merci si vous pouvez encore m'aider.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 ;;; lignes : Paragraphe -> LISTE[Ligne] ;;; (lignes paragraphe) rend la liste des lignes contenues dans ;;; le paragraphe donné ;;; fin de ligne \n (define (lignes paragraphe) (if (equal? paragraphe "") (list) (cons (extraire-prem-ligne 0 paragraphe "") (lignes (substring paragraphe (+ 1 (string-length (extraire-prem-ligne 0 paragraphe ""))) (string-length paragraphe)))))) ;;; extraire-prem-ligne : Paragraphe * String -> Ligne ;;; (extraire-prem-ligne P acc) rend la première ligne du paragraphe ;;; P, sans le caractère de fin de ligne (define (extraire-prem-ligne n P acc) (if (or (= (string-length P) 0) (= n 1)) acc (if (equal? (substring P 0 1) "\n") (extraire-prem-ligne 1 (substring P 1 (string-length P) ) acc) (extraire-prem-ligne 0 (substring P 1 (string-length P)) (string-append acc (substring P 0 1)))))) (trace extraire-prem-ligne) (extraire-prem-ligne 0 "lig5\nlig6" "")
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 ;; paragraphe-cons : Ligne * Paragraphe -> Paragraphe ;;; (paragraphe-cons ligne para) rend le paragraphe dont la première ;;; ligne est "ligne" et dont les lignes suivantes sont constituées par ;;; les lignes du paragraphe "para" (define (paragraphe-cons ligne para) (if (= (string-length para) 0) (string-append ligne para) (string-append ligne "\n" para))) ;;; paragraphe : LISTE[Ligne] -> Paragraphe ;;; (paragraphe L) rend le paragraphe formé des lignes de la liste L (define (paragraphe L) (if (pair? L) (paragraphe-cons (car L) (paragraphe (cdr L))) "")) (trace paragraphe) (paragraphe (list "ligne1" "ligne2" "ligne3" "ligne4"))
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 ;;; ab-vide? : ArbreBinaire (alpha) -> bool ;;; (ab-vide? B) rend vrai ssi B est un arbre vide et faux sinon (define (ab-vide? B) (not (ab-noeud? B))) ;;; ab-noeud? vrai si B non vide donc avec Not, vrai si vide (define (ab-feuille? B) ;;; vrai si B est une feuille (and (ab-noeud? B) ;;; B non vide (not (ab-noeud? (ab-gauche B))) ;;; ab-gauche vide (not (ab-noeud? (ab-droit B))))) ;;; ab-droit vide (define (->string e) (cond ((number? e) (number->string e)) ((symbol? e) (symbol->string e)) (else e))) ;;; ab-B2 : -> ArbreBinaire (string) ;;; (ab-B2) rend l'arbre B2 (define (ab-B2) (let* ((B1 (ab-noeud "f" (ab-vide) (ab-vide))) (B2 (ab-noeud "g" (ab-vide) (ab-vide))) (B1-1 (ab-noeud "c" (ab-vide) (ab-vide))) (B3 (ab-noeud "e" B2 (ab-vide))) (B4 (ab-noeud "d" B3 B1)) (B5 (ab-noeud "b" B1-1 B4))) (ab-noeud "a" B5 (ab-vide)))) (define (ab-affichage B) ;; add-tiret-prefixe : ligne ->Ligne ;; (add-tiret-prefixe ligne) rend la ligne obtenue en ajoutant un tiret devant "ligne" (define (add-tiret-prefixe ligne) (string-append "-" ligne)) ;; expression de (ab-affichage B): (if (ab-vide? B) (paragraphe '("vide")) (paragraphe-cons (->string (ab-etiquette B)) (paragraphe (map add-tiret-prefixe (append (lignes (ab-affichage (ab-gauche B))) (lignes (ab-affichage (ab-droit B))))))))) (trace ab-affichage) (ab-affichage (ab-B2))
Partager