3.3. Listes, des listes et encore des listes

Après avoir vu les variables et les fonctions, abordons maintenant la difficile question des Listes Scheme.

Avant d'en dire plus sur les listes, vous devez connaître la différence entre les valeurs atomiques et les listes.

Vous avez déjà vu des valeurs atomiques quand nous avons initialisé des variables précédemment. Une valeur atomique est une variable qui a une valeur unique. Nous pouvons, par exemple, attribuer à la variable x la valeur unique 8 (et rien d'autre) par la déclaration suivante :

(let* ( (x 8) ) x)

(Nous avons ajouté l'expression x à la fin pour afficher la valeur attribuée à x, mais vous n'avez pas normalement à le faire. Notez comment opère <code>let*</code>, comme une fonction : la valeur de la dernière déclaration est la valeur retournée.)

Une variable peut aussi se référer à une liste de valeurs, plutôt qu'à une valeur unique. Pour attribuer à la variable x la liste de valeurs 1, 3, 5, nous devons taper :

(let* ( (x '(1 3 5))) x)

Essayez de taper les deux déclarations dans la Console de Script-Fu et voyez ce que ça donne. Avec la première, vous obtenez :

8

Et avec l'autre déclaration:

(1 3 5)

Le premier résultat vous informe que la variable x contient la valeur atomique 8. Le deuxième résultat signifie que la variable contient une liste de valeurs. Notez qu'il n'y a pas de virgule, ni dans la déclaration, ni dans l'affichage.

La syntaxe pour définir une liste de valeurs est :

'(a b c)

a, b, et c sont des littéraux. Nous avons utilisé l'apostrophe (') pour indiquer que ce qui suit dans les parenthèses est une liste de valeurs littérales, plutôt qu'une fonction ou une expression.

Une liste vide est définie comme suit :

'()

ou simplement :

()

Outre les valeurs atomiques, les listes peuvent contenir d'autres listes :

(let*
   (
        (x
           '("GIMP" (1 2 3) ("is" ("great" () ) ) )
        )
    )
    x
)
      

Notez qu'après la première apostrophe, vous n'avez plus besoin d'utiliser d'autres apostrophes lors de la définition des listes internes. Testez cette déclaration dans la Console de Script-Fu.

Vous verrez que le résultat n'est pas une suite de valeurs simples, mais plutôt la liste d'un littéral <code>("GIMP")</code>, d'une liste <code>(1 2 3)</code>, etc.