Lisp at 5.3. Extension du langage

Home
Up
Previous
Next

5.3. Extension du langage

Pour écrire la fonction STRUCTURE-MENU, il est nécessaire d'accéder aux noms des champs de la structure; il n'existe pas de langage qui fournisse une primitive permettant d'accéder aux noms des champs d'une instance. Cependant, en Lisp cela se réalise aisément, grâce au caractère auto-programmable du Lisp.

On peut définir une macro, EXTENDED-DEFSTRUCT, qui aura deux rôles, celui de définir la structure et celui de rendre accessibles les noms des champs de la structure; la définition de la structure PERSON, s'écrira alors comme ceci :

(EXTENDED-DEFSTRUCT PERSON
                    NAME
                    SEX
                    TITLE
                    AGE)

=> ...

L'évaluation de la forme ci-dessus (l'application de la macro EXTENDED-DEFSTRUCT aux arguments PERSON NAME ...) a pour conséquence la définition de la structure comme précédemment et l'accès possible aux noms des champs comme ceci :

(GET 'PERSON 'SLOT-NAMES)
=> (NAME SEX TITLE AGE)

EXTENDED-DEFSTRUCT est défini comme une macro à l'aide de l'opérateur DEFMACRO; pour les lecteurs intéressés, voici cette macro :

(DEFMACRO EXTENDED-DEFSTRUCT (NAME &REST SLOT-NAMES)
   `(PROGN
      (PUTPROP (QUOTE ,NAME) (QUOTE ,SLOT-NAMES) 'SLOT-NAMES)
      (DEFSTRUCT ,NAME ,@SLOT-NAMES)))

Commentaires

  1. Il y a deux phases dans l'application d'une macro : premièrement, génération de code et deuxièmement évaluation du code généré. Dans notre exemple, le code généré est :

    (PROGN
       (PUTPROP 'PERSON '(NAME SEX TITLE AGE) 'SLOT-NAMES)
       (DEFSTRUCT PERSON NAME SEX TITLE AGE))

    où on retrouve la définition de la structure PERSON.

    PUTPROP associe une propriété SLOT-NAMES au symbole PERSON, propriété dont la valeur est la liste des noms de champs.

    GET est l'opérateur qui permet d'accéder à la valeur d'une propriété d'un symbole.

  2. La syntaxe du DEFSTRUCT est plus fouillée que ne le montre l'exemple, notamment parce qu'il est possible de spécifier le type d'un champ. Pour tenir compte de la syntaxe complète de DEFSTRUCT, la macro EXTENDED-DEFSTRUCT sera donc un peu plus complexe; d'autre part, elle permettra aussi de retrouver le type associé à un champ.
Home    Previous    Up    Next
contact
site map
Last update : 04/12/2001