Toutes les parenthèses sont remplaçables par des crochets mais apparemment vous savez qui n'est pas au courant donc vaut peut être mieux pas l'utiliser pour le DS mais ça rend les exemples en dessous plus clairs.
map
(map fonction liste) ; Exemple: (map car '((1 2 3) (4 5 6) (7 8 9))) ; => '(1 4 7)
curry
curry
permet de "commencer" un appel de fonction et de l'exécuter
qu'une fois que le nombre nécessaire d'arguments est présents. Ça fonctionne
un petit peu comme un accumulateur.
(curry fonction argument) ; Exemple (define variable (curry + 10)) ; "devient" une fonction appelable (variable 5) ; => 15 (variable 12) ; => 22
let
et letrec
let
permet d'associer une valeur à un symbole:
; Exemple (let ([x 10] [y 20]) (+ y x)) ; => 30
Le let
ne permet de référencer un symbole définit par lui même dans la
définition d'un autre mais letrec
peut:
; Exemple (letrec ([x 10] [y (+ x 1)]) (+ y x)) ; => 21
cond
cond
marche un peu comme un switch
en C à la différence que cond
permet
de vérifier n'importe quelle type de condition, pas uniquement sur la valeur
d'une variable:
; #t est le cas par défaut
(cond [(= 0 symbole) (instruction1)]
[(= 1 symbole) (instruction2)]
[#t (instruction3)])
switch(symbole) {
case 0:
instruction1;
break;
case 1:
instruction2;
break;
default:
instruction3
break;
}
Les fonctions gauche
, droite
, valeur
et concat
sont définies dans le cours
par:
(define gauche (lambda (A) (cadr A))) (define droite (lambda (A) (caddr A))) (define valeur (lambda (A) (car A))) (define concat (lambda (L1 L2) (if (null? L1) L2 (cons (car L1) (concat (cdr L1) L2)))))
Pour un arbre A donné, définir une fonction qui vérifie si A est ordonné ou non.
(define ordonne? (lambda (A) (if (null? A) #t (and (inferieurs (lesValeurs (gauche A)) (valeur A)) (superieurs (lesValeurs (droite A)) (valeur A)) (ordonne? (gauche A)) (ordonne? (droite A))))))
(define inferieurs (lambda (L v) (if (null? L) #t (and (<= (valeur L) v) (inferieurs (cdr L) v)))))
(define superieurs (lambda (L v) (if (null? L) #t (and (> (valeur L) v) (superieurs (cdr L) v)))))
(define lesValeurs (lambda (A) (if (null? A) '() (concat (lesValeurs (gauche A)) (cons (valeur A) (lesValeurs (droite A)))))))
Définir une fonction qui pour une liste L et un opérator `op donné, vérifie si une liste est bien ordonnée:
(define listeOrdonnee? (lambda (L op) (if (or (null? L) (null? (cdr L))) #t (and (op (car L) (cadr L)) (listeOrdonnee? (cdr L) op))))) ; Et après on appelle la fonction comme ça pour vérifier si elle ; est triée dans l'ordre croissant: ; ; (listeOrdonnee? '(1 2 3) <=) ; ; Ou comme ça pour l'ordre décroissant: ; ; (listeOrdonnee? '(3 2 1) >)