Lisp at 5.1. Une fonction de menu générique

Home
Up
Previous
Next

5.1. Une fonction de menu générique

L'exemple de ce chapitre illustre divers aspects du Lisp dont les fonctions génériques, la manipulation symbolique et l'extension du langage par des macros.

STRUCTURE-MENU est une fonction qui prend en argument une instance de structure quelconque et génère un menu de type formulaire permettant de visualiser et de modifier les champs de cette instance de structure (voir la figure de la page suivante).

Dans ce chapitre, l'objectif n'est pas de détailler comment cette fonction est programmée, mais d'illustrer certaines techniques de programmation à travers cette fonction et de montrer combien il est simple, pour un programme client, d'utiliser cette fonction.

Bien que plus riche, la notion de structure en Lisp est similaire à celle de structure, de record ou d'enregistrement que l'on trouve dans d'autres langages; généralement, les autres termes associés à cette notion sont :

  • instance ou incarnation d'une structure,
  • champ ou composant (slot en anglais) d'une structure,
  • valeur d'un champ d'une instance de structure.

En Lisp, DEFSTRUCT est l'opérateur de définition d'une structure; dans l'exemple ci-dessous, la structure créée a PERSON comme nom et possède 4 champs (NAME, SEX, TITLE et AGE).

(DEFSTRUCT PERSON
    NAME
    SEX
    TITLE
    AGE)

Pour créer une instance de cette structure, il suffit de faire appel au constructeur MAKE-PERSON (automatiquement défini par le DEFSTRUCT, lors de la définition de la structure PERSON). L'instance est affectée à la variable PERSON-1 via l'opérateur d'affectation SETF (voir l'annexe 1 pour plus de détails à propos de SETF) :

(SETF PERSON-1
      (MAKE-PERSON
           :NAME 'SMITH
           :SEX 'M
           :TITLE 'MR
           :AGE 35))

Une fois la fonction STRUCTURE-MENU programmée, pour faire apparaître le menu-formulaire permettant de voir et de modifier le contenu des 4 champs de l'instance de structure PERSON-1, il suffit d'écrire :

(STRUCTURE-MENU PERSON-1)

La figure ci-dessous montre un exemple d'interaction de l'utilisateur avec ce menu : l'utilisateur a sélectionné le champ TITLE; une fenêtre de saisie apparaît où il peut introduire une nouvelle valeur pour ce champ, soit Dr.

La fonction STRUCTURE-MENU est générique : elle est utilisable pour n'importe quelle instance de n'importe quelle structure. Cela signifie aussi qu'il est possible d'ajouter un champ à la définition de la structure PERSON sans pour autant devoir modifier les programmes qui utilisent le menu en question (le nouveau champ apparaissant automatiquement dans le menu).

Commentaires

  1. Les structures Lisp définies par DEFSTRUCT sont sophistiquées; en voici quelques caractéristiques :

    • En plus de définir un constructeur (MAKE-PERSON), DEFSTRUCT définit un copieur, des accesseurs pour chacun des champs, etc. Par exemple, dans le cas de la structure PERSON, sont définis le copieur COPY-PERSON et l'accesseur PERSON-AGE pour le champ AGE :

      (PERSON-AGE PERSON-1)

      => 33

    • Pour chaque champ, on peut spécifier un type et une valeur par défaut. Il n'y a pas de restriction sur les types de valeur que peut prendre un champ.
    • La définition d'une structure peut inclure la définition d'une autre structure (héritage des champs).
  2. En pratique, la fonction STRUCTURE-MENU sera plus élaborée; entre autres:

    • elle autorise la définition de fonctions de validation explicites (voir le paragraphe 5.2. ci-dessous);
    • elle peut prendre des arguments optionnels pour, par exemple, spécifier la position du menu sur l'écran ou indiquer que certains champs de l'instance ne peuvent figurer au menu.
  3. Remarquons qu'il n'est pas nécessaire d'allouer explicitement de la mémoire pour créer l'instance PERSON-1.
Home    Previous    Up    Next
contact
site map
Last update : 04/12/2001