Lisp at 3. L'opérateur QUOTE bloque l'évaluation d'un argument

Home
Up
Previous
Next

L'opérateur renvoie le premier élément d'une liste; supposons que l'on désire obtenir le premier élément de la liste (a b c) :

(FIRST (a b c))
=> erreur!

<>En effet, l'évaluateur cherche la valeur fonctionnelle de "a", or "a" n'a pas de valeur fonctionnelle associée ("a" n'est pas une fonction), d'où l'affichage d'un message d'erreur. Par contre :

(FIRST (QUOTE (a b c))
=> a

L'opérateur QUOTE prend un argument. Contrairement à la règle d'évaluation d'une expression énoncée ci-dessus, l'argument de QUOTE n'est pas évalué (QUOTE fait exception à la règle et est dit fonction spéciale). L'application de QUOTE à un argument renvoie simplement l'argument non évalué (QUOTE bloque l'évaluation de l'argument). Ainsi :

(QUOTE (a b c))
=> (a b c)

(QUOTE a)
=> a

En pratique, l'opérateur QUOTE étant souvent utilisé, on a adopté une abréviation (celle du caractère macro '):

'(a b c)
=> (a b c)

(FIRST '(a b c))
=> a

L'opérateur LIST est l'opérateur de construction d'une liste :

(LIST 'a 'b 'c 1 2 3)
=> (a b c 1 2 3)

Remarques

  1. C'est le reader qui convertit '(a b c) en (QUOTE (a b c)) (voir ci-dessus la boucle READ-EVAL-PRINT). De façon générale, le reader convertit '<expression> en (QUOTE <expression>) . Un programmeur Lisp peut aisément définir ses propres caractères macros.

    Cette possibilité d'attacher un comportement fonctionnel à un caractère permet de définir aisément de nouveaux caractères syntaxiques: c'est une des propriétés du Lisp très appréciée pour implanter les special purpose programming languages (SPPL - voir le paragraphe 1.1, chapitre 1).

  2. Dans l'exemple 1 (chapitre 3), on a vu un autre cas de caractères macros, #' dans #'(LAMBDA ...). #'(LAMBDA ...) est convertit en (FUNCTION (LAMBDA ...)), FUNCTION étant un opérateur Lisp annonçant une fonction.

Home    Previous    Up    Next
contact
site map
Last update : 26/12/2001