Une expression est une représentation externe (sous forme de texte) d'un bout de programme.
Dans un langage comme C ou Java, les expressions (et les instructions) sont toujours lues par le compilateur, puis stockées dans une structure de données choisie par le constructeur du compilateur. Le compilateur parcourt cette structure pour générer du code objet dont l'exécution correspond à la sémantique de l'expression donnée par la définition du langage.
Common Lisp étant un langage interactif, il est important de comprendre comment ces expressions sont traduites en programme, puis exécutées et finalement affichées sous forme de valeur par la boucle d'interaction (voir figure 4.1).
La première phase de la boucle d'interaction est celle de lecture. Son but est de traduire l'expression en un format interne. C'est la fonction Common Lisp read qui est chargée de cette lecture. Le résultat de read est une structure de donnée, comme en C ou Java, à la différence que la structure interne qui en résulte est normalisée par la définition du langage Common Lisp. Tous les programmeurs Common Lisp connaissent la représentation interne d'une expression. Cela peut sembler difficile, mais en fait la correspondance entre représentation externe et représentation interne est immédiate. Nous en reparlerons plus tard. Pour l'instant, il suffit de se souvenir que la forme interne d'une expression est un objet (une structure de données) du langage Common Lisp, de la même manière que le flottant 5.3425 est un objet dans la plupart des langages de programmation.
La deuxième phase de la boucle d'interaction est l'évaluation de l'expression. Comme en C ou Java, l'expression est traduite en code exécutable, mais en Common Lisp ce code est immédiatement exécuté. Le résultat de cette exécution est une valeur qui est un autre objet Common Lisp. Cette phase est implémentée par une autre fonction Common Lisp dont le nom est eval.
La troisième et dernière phase de la boucle d'interaction est l'écriture de la valeur calculée dans la deuxième phase. Ici écriture signifie traduction d'une représentation interne en une représentation externe. C'est donc l'opération inverse de la lecture. Cette phase est implémentée par une fonction Common Lisp dont le nom est print.
Common Lisp distingue trois types d'expressions : les objets auto-évaluants, les symboles et les expressions composées.