![]() |
Programmez un Tetris en Java 360 pages PDF pour apprendre à votre rythme. Développez des jeux vidéo en Java. www.jdevmaker.com |
Ce document est sous un contrat Creative Commons.
Nous ne verrons ici que la liste dans sa forme la plus simple, les autres n'étant pas très utiles pour l'écriture d'un script-fu.
La compréhension des listes est vitale, parce qu'elles sont véritablement partout !
Une liste Scheme est véritablement une liste au sens strict du terme.
Ainsi la forme suivante : 1, 2, 3, 4, 5, s'écrirait en Scheme :
'(1 2 3 4 5)
La syntaxe conditionnant la liste est l'apostrophe, suivi des éléments entre parenthèse et séparés par au moins un espace.
La liste peut contenir de 1 à plusieurs éléments. Ainsi la forme suivante est aussi une liste :
'(1)
Une liste est toujours constitué de 2 choses : une tête et une queue.
La queue est elle-même constituée d'une tête et d'une queue, et ainsi de suite...
Ainsi pour notre exemple '(1 2 3 4 5) nous aurions :
Il existe en scheme 2 fonctions qui permettent d'isoler la tête et la queue, respectivement car et cdr.
Nous allons de nouveau utiliser la console script-fu afin d'illustrer le sujet.
Créons une variable liste contenant notre exemple de liste :
'(1 2 3 4 5).
=> (set! liste '(1 2 3 4 5))
(1 2 3 4 5)
car permet d'obtenir la tête, ainsi,
=> (car liste)
1
cdr permet d'obtenir la queue, ainsi,
=> (cdr liste)
(2 3 4 5)
Avec ces 2 seules fonctions et la merveilleuse caractéristique d'emboîtement du Scheme, il est possible d'obtenir n'importe qu'elle valeur de la liste. Ainsi,
=> (car (cdr liste))
2
=> (cdr (cdr liste))
(3 4 5)
=> (car (cdr (cdr liste)))
3
=> (cdr (cdr (cdr liste)))
(4 5)
=> (car (cdr (cdr (cdr liste))))
4
=> (cdr (cdr (cdr (cdr liste))))
(5)
=> (car (cdr (cdr (cdr (cdr liste)))))
5
Cette notation est assez pénible ! Aussi existe-t-il des dérivés des formes primaires car et cdr, résultant de la concaténation de celle-ci :
cadr, cddr, caddr, et cdddr. Au delà, il faudra de nouveau utiliser les emboîtements.
Voici une comparaison avec les formes primaires que nous avons déjà utilisées :
(car liste) |
|
|
(cdr liste) |
|
|
(car (cdr liste)) |
--> |
(cadr liste) |
(cdr (cdr liste)) |
--> |
(cddr liste) |
(car (cdr (cdr liste))) |
--> |
(caddr liste) |
(cdr (cdr (cdr liste))) |
--> |
(cdddr liste) |
(car (cdr (cdr (cdr liste)))) |
--> |
(car (cdddr liste)) |
(cdr (cdr (cdr (cdr liste)))) |
--> |
(cdr (cdddr liste)) |
(car (cdr (cdr (cdr (cdr liste))))) |
--> |
(cadr (cdddr liste)) |
De nombreuses options du script-fu-register utilisent des listes. Exemple :
SF-ADJUSTMENT "hauteur" '(100 1 800 1 100 0 1)
Les définitions de couleurs utilisent des listes à 3 éléments, chacun représentant respectivement le rouge, le vert et le bleu, soit par exemple :
(set! color '(103 25 212)) ;; la variable color contient une couleur
Enfin, lorsque qu'une procédure retourne une valeur, c'est sous forme de liste, le plus souvent une liste à 1 élément.
Maintenant, vous pouvez comprendre pourquoi nous avons du utiliser la fonction car plusieurs fois au cours du script, pour définir les variables mode, width, height et new-layer.
Ainsi la procédure (gimp-image-width img) nous retourne une liste contenant 1 élément équivalent à la largeur de l'image active.
Aussi la forme (set! width (gimp-image-width img)) est impropre puisqu'elle ne permet pas d'obtenir la valeur de la liste rendue. Ce n'est cependant pas cette s-expression qui provoquerait l' erreur, mais au moment ou le script tenterait de créer un nouveau calque avec la variable width contenant une liste et non une valeur. Cette variable doit contenir une valeur et non une liste. Aussi nous faut-il utiliser car afin d'obtenir cette valeur.
Avec une image de largeur 400, avec (set! width (gimp-image-width img)) nous obtiendrions width égale à '(400).
Avec (set! width (car (gimp-image-width img))) nous obtenons width égale à 400.
Aussi l'emploi de car est-il très fréquent.
Les variables contenant des listes sont un nouveau types de variables. Encore une fois les 3 types que nous connaissons maintenant (numériques, chaînes et listes) sont incompatibles.