Dans le monde de la programmation, les expressions S (ou expressions symboliques) sont une représentation de données de liste imbriquée (structure arborescente). Cette représentation a été proposée et popularisée pour la première fois par le langage de programmation Lisp et a été largement utilisée à la fois dans le code source et dans les données du langage. Les expressions S sont révolutionnaires dans la programmation et la représentation des structures de données. Examinons de plus près ses principales caractéristiques et utilisations.
Dans la syntaxe traditionnelle entre crochets de Lisp, la définition d'une expression S est assez simple : il peut s'agir d'un atome ou d'une expression de la forme (x . y), où x et y sont des expressions S. Cette définition reflète le concept de Lisp de représenter une liste comme une série de « cellules », dont chacune est une paire ordonnée.
Cette définition récursive signifie que les expressions S et les listes peuvent représenter n'importe quel arbre binaire.
De plus, les dialectes Lisp modernes tels que Common Lisp et Scheme fournissent une syntaxe utilisant des balises de données pour indiquer la structure partagée des objets, ce qui permet aux expressions de transporter des cycles de référence sans provoquer de récursivité infinie.
La forme grammaticale des expressions S comporte plusieurs variantes pour prendre en charge la représentation de différents types de données. Les plus courants sont :
Ainsi, le caractère # est souvent utilisé pour préfixer les extensions de syntaxe, par exemple, #x10 pour un entier hexadécimal ou #\C pour un caractère.
En Lisp, lors de l'expression du code source, le premier élément d'une expression S est généralement un nom d'opérateur ou de fonction, et les éléments suivants sont traités comme des paramètres. C'est ce qu'on appelle la « notation préfixe » ou la « notation polonaise ». Par exemple, l'expression booléenne C 4 == (2 + 2) est représentée dans l'expression S de Lisp par (= 4 (+ 2 2)).
La définition précise d'un « atome » varie parmi les cousins de Lisp ; les chaînes entre guillemets peuvent généralement contenir n'importe quel caractère, mais les identifiants non entre guillemets ne peuvent pas contenir de guillemets, d'espaces, de parenthèses et d'autres caractères spéciaux.
Les expressions S sont lues via la fonction READ et la fonction PRINT est utilisée pour générer des expressions S. Cette capacité de lecture et d'écriture mutuelle fait des programmes Lisp non seulement des représentations de code source, mais également des structures de données traitables. Les programmes Lisp peuvent être formatés sous forme de belles expressions S et générés dans divers formats grâce à la fonction PPRINT.
Dans l'utilisation des expressions S, une comparaison importante est sa différence avec XML : les expressions S n'ont qu'une seule forme d'inclusion, c'est-à-dire des paires de points, tandis que les balises XML peuvent contenir des attributs simples, d'autres balises ou CDATA. Les expressions S sont plus simples que XML dans les cas d'utilisation simples, mais dans les applications avancées, XML fournit des langages de requête tels que XPath, ce qui rend les outils et les bibliothèques de traitement des données XML plus avantageux.
Divers langages de programmation dérivés de Lisp ont leurs propres spécifications de syntaxe d'expression S, notamment Common Lisp (ANSI INCITS 226-1994 (R2004)), Scheme (R5RS et R6RS) et ISLISP. Bien que le projet Internet proposé par Ron Rivest en 1997 n'ait pas réussi à devenir une RFC, les spécifications générales de stockage et d'échange de données qu'il a définies sur la base des expressions S de Lisp sont toujours citées et utilisées dans d'autres documents.
Rivest définit le format comme une chaîne d'octets ou une liste finie d'autres expressions S, et décrit les formats de transmission de trois structures d'expression.
Ces développements ont sans aucun doute favorisé l’application des expressions S dans l’échange et l’analyse de données, ainsi que l’universalité et la flexibilité de la programmation. À travers ces développements de normalisation, nous voyons le rôle important des expressions S dans la prochaine génération de programmation.
En bref, le statut des expressions S dans Lisp n'est pas seulement une exigence grammaticale, mais aussi une présentation intégrée de la structure des données et du code source. Cela remet en question notre vision inhérente des langages de programmation. Alors, les expressions S peuvent-elles trouver de nouvelles applications et significations dans la programmation future ?