APPLICATION : AUTOMATE CELLULAIRE
RAPPEL: EN SCHEME, UNE FONCTION PEUT ÊTRE ARGUMENT D'UNE AUTRE FONCTION
(SUPER-MAX '(1 2 3 4) +) --> 10 = 1+2+3+4
+ EST UNE FONCTION ARGUMENT DE
SUPER-MAX
(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)))))
EXEMPLE : EFFET DE BORD = AFFICHER UN ÉLÉMENT ET ALLER À LA LIGNE
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 <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-QUATRE <F> <L1> <L2> <L3> <L4>)
--> PARCOURT SIMULTANÉMENT <L1>, <L2>, <L3>, <L4> EN APPLIQUANT <F> SUR LES ÉLÉMENTS EN MÊME POSITION, ET DONNE LA LISTE DES RÉSULTATS
ARRÊT DES QU'UNE LISTE EST VIDE
(DEFINE (MAP-QUATRE 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-QUATRE F (CDR L1) (CDR L2)
(CDR L3) (CDR L4))))))
(MAP-TROIS-BIS <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-BIS F L)
(COND ((NULL? (CDDR L)) '())
(ELSE (CONS (F (CAR L)
(CADR L)
(CADDR L)))
(MAP-TROIS-BIS F (CDR L))))))
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-QUATRE
(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-BIS
(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"