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
*
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?