TOP
tetris Programmez un Tetris en Java
360 pages PDF pour apprendre à votre rythme.
Développez des jeux vidéo en Java.
www.jdevmaker.com
Gimp 2.4
Documentation
Tutoriels
Ressources
Divers

Dernière mise à jour le 07 avr 2008
consultée 4316 fois
Apprendre  ›  Écrire un script-fu  ›  Tutoriel partie 12

 

Scheme, Tutoriel : Initiation avancée partie 12

Ce document est sous un contrat Creative Commons.

 

Les listes

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.

 

Introduction

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.

 

Un peu de pratique

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))

 

Les listes sont partout

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.

 

Type

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.

 

 

Valide XHTML 1.0 Strict
Valide CSS 2.0
Valide Accessibilité
Creative Commons License

Tous les documents et ressources sont sous un contrat Creative Commons.