Opérateurs spéciaux

Si le premier élement de la liste n'est pas le nom d'une fonction, mais celui d'un opérateur spécial, eval applique la règle spécifique à cet opérateur. Voici la liste complète de tous les opérateurs spéciaux de Common Lisp : block, let*, return-from, catch, load-time-value, setq, eval-when, locally, symbol-macrolet, flet, macrolet, tagbody, function, multiple-value-call, the, go, multiple-value-prog1, throw, if, progn, unwind-protect, labels, progv, let, quote.

La plupart des opérateurs spéciaux en Common Lisp ont leur correspondance dans d'autres langages sous la forme d'instructions comme l'affectation, le bloc ou le if.

Une des difficultés de l'apprentissage d'un langage de programmation est la nécessité de se souvenir de la syntaxe et de la sémantique (la règle d'évaluation) de ses instructions. Exemples :

* (if (> *read-base* 2) (expt *print-base* 2) "quoi?")

100
* (let ((*read-base* 5)) (+ *read-base* (sin *read-base*)))

4.0410757
*

La règle pour if est :

  1. évaluer le premier argument ;
  2. si sa valeur est vrai, alors évaluer le deuxième argument, sinon évaluer le troisième argument ;
  3. renvoyer la valeur de l'argument évalué comme valeur de l'expression entière.

Ici, le test (> *read-base* 2) est vrai. Le deuxième argument est alors évalué et sa valeur est renvoyée.

La règle de let sera explicitée dans le chapitre 10.

Exercice (moyen, bref) : Pourquoi est-ce que if est un opérateur spécial et pas une fonction?

Irene DURAND
2011-10-14