APPLICATION : AUTOMATE CELLULAIRE
REMARQUE FONDAMENTALE:
(DEFINE (F G) (G 2 3))
> (F +)
> (F *)
6
+, * SONT DES FONCTIONS ARGUMENTS DE F
"ITÉRATEUR": RÉPÈTE PLUSIEURS FOIS
(MAP <FONCTION> <LISTE>)
--> APPLIQUE <FONCTION> SUR TOUS LES ÉLÉMENTS DE <LISTE>, ET DONNE LA LISTE DES RÉSULTATS
EX: (MAP SQRT '(4 9 25)) --> (2. 3. 5.)
(MAP-EFFET-BORD <FONCTION> <LISTE>)
--> APPLIQUE L'EFFET DE BORD
<FONCTION> SUCCESSIVEMENT A CHAQUE
ÉLÉMENT DE <LISTE>
(DEFINE (MAP-EFFET-BORD FONC L)
(COND ((NULL? L) 'FIN)
(ELSE (FONC (CAR L))
(MAP-EFET-BORD FONC (CDR L)))))
ON VEUT AFFICHER L'EFFET DE BORD SUIVANT
PEUT-ON UTILISER CETTE FONCTION SANS LA DÉFINIR ???
EN SCHEME CELA S'ÉCRIT :
(LAMBDA (X) (DISPLAY X) (NEWLINE))
L'ÉVALUATION DE CETTE EXPRESSION PRODUIT UN "OBJET FONCTIONNEL" SANS LUI DONNER DE NOM, DONC SANS LE RAJOUTER A L'ENVIRONNEMENT GLOBAL
(DEFINE (AFFICHER-LISTE L)
(MAP-EFFET-BORD
(LAMBDA (X) (DISPLAY X) (NEWLINE)) L))
(MAP-TROIS <F> <L>)
--> APPLIQUE <F> SUR TOUS LES TRIPLETS D'ÉLÉMENTS CONSÉCUTIFS DE <L> ET DONNE LA LISTE DES RÉSULTATS
(DEFINE (MAP-TROIS F L)
(COND ((NULL? (CDDR L)) '())
(ELSE (CONS (F (CAR L)
(CADR L)
(CADDR L)))
(MAP-TROIS F (CDR L))))))
MAP ACCEPTE UN NOMBRE QUELCONQUE
--> VARIANTE AVEC LONGUEURS DIFFÉRENTES:
ON S'ARRÊTE DÈS QU'UNE LISTE EST VIDE
(MAP-AUX <F> <L1> <L2> <L3> <L4>)
--> PARCOURT SIMULTANÉMENT <L1>, <L2>, <L3>, <L4> JUSQU'À LA FIN DE LA PLUS COURTE
EN APPLIQUANT <F> SUR LES ÉLÉMENTS EN MÊME POSITION, ET DONNE LA LISTE DES RÉSULTATS
(DEFINE (MAP-AUX F L1 L2 L3 L4)
(COND ((OR (NULL? L1) (NULL? L2)
(NULL? L3) (NULL? L4)) '())
(ELSE (CONS (F (CAR L1) (CAR L2)
(CAR L3) (CAR L4))
(MAP-AUX F (CDR L1) (CDR L2)
(CDR L3) (CDR L4))))))
MATRICE DE CELLULES :
AU DÉPART : 1 SUR LE POURTOUR, 0 A L'INTÉRIEUR
("JEU DE LA VIE" SIMPLIFIÉ)
L'ÉVOLUTION NE CONCERNE QUE L'INTÉRIEUR
EN SCHEME, LA MATRICE EST REPRÉSENTÉE
PAR LA LISTE DE SES LIGNES
DANS LA LIGNE Y, LES CELLULES À REMPLACER COMMENCENT A (CDR Y)
LISTE DES VOISINS CORRESPONDANTS:
L2 = Y --> VOISINS OUEST
L3 = (CDDR Y) --> VOISINS EST
L4 = (CDR Z) --> VOISINS SUD
REMPLACEMENT DE LA LIGNE Y:
--> PARCOURS SIMULTANÉ DES 4 LISTES
L1, L2, L3, L4
ARRET DÉTERMINÉ PAR LA PLUS COURTE
L3 = (CDDR Y)
(DEFINE (FABRIQUE-LIGNE L1 L2 L3 L4)
(APPEND (LIST 1)
(MAP-AUX
(LAMBDA (N O E S)
(IF (AND (= N O) (= O E) (= E S))
0 1))
L1 L2 L3 L4)
(LIST 1)))
TRANSFORMATION DE LA MATRICE D'UN ÉTAT
--> REMPLACER TOUTES LES LIGNES
INTÉRIEURES DE LA MATRICE
(DE LA 2EME A L'AVANT-DERNIERE)
B = LISTE DE 1 POUR LA BORDURE
(DEFINE (TRANSFORME-AUTOMATE AUT B)
(APPEND (LIST B)
(MAP-TROIS
(LAMBDA (X Y Z)
(FABRIQUE-LIGNE (CDR X)
Y
(CDDR Y)
(CDR Z)))
AUT)
(LIST B)))
FONCTION GÉNÉRALE:
(REPETE ELEMENT K)
--> FABRIQUE UNE LISTE CONTENANT K FOIS ELEMENT
(DEFINE (REPETE ELEMENT K)
(IF (= K 0) '()
(CONS ELEMENT (REPETE ELEMENT (- K 1)))))
(DEFINE (AUTOMATE-INITIAL N P)
(LET ((L1 (REPETE 1 P))
(L0 (APPEND (LIST 1)
(REPETE 0 (- P 2))
(LIST 1))))
(APPEND (LIST L1)
(REPETE L0 (- N 2))
(LIST L1))))
(DEFINE (PROGRAMME-CELLULE)
(OPEN-GRAPHICS)
(LET ((W (OPEN-VIEWPORT (* NBCOL COEF)
(* NBLIGNE COEF))))
(CELLULE (AUTOMATE-INITIAL NBCOL NBLIGNE) W)))
CELLULE --> BOUCLE RÉCURSIVE INFINIE RÉPÉTANT LA TRANSFORMATION
(DEFINE (CELLULE AUT W) (AFFICHE-MATRICE AUT W) (CELLULE (TRANSFORME-AUTOMATE AUT (CAR AUT)) W))AFFICHE-MATRICE
--> TRACE L'AUTOMATE DANS UNE FENÊTRE AVEC DES PETITS CARRÉ DE HAUTEUR "COEF"