S-expresión

El término S-expression o sexp (abreviatura de "Symbolic expression" [1]  - expresión simbólica en inglés  ) se refiere a un acuerdo sobre cómo escribir datos semiestructurados en forma de texto legible por humanos. Las expresiones simbólicas se construyen principalmente a partir de símbolos y listas. Las expresiones S son más conocidas por su uso en la familia de lenguajes de programación Lisp . Las expresiones S también se utilizan en lenguajes derivados de Lisp como DSSSL y marcado en protocolos de comunicación como IMAP y CBCL de John McCarthy . . Los detalles de la sintaxis y los tipos de datos admitidos difieren entre idiomas, pero una característica común es el uso de expresiones S como notación de prefijo usando corchetes (conocido como notación polaca de Cambridge ).

Las expresiones S se utilizan en Lisp tanto para el código como para los datos (consulte McCarthy "Funciones de expresiones simbólicas recursivas" ). Las expresiones S originalmente estaban destinadas solo a representar datos que las expresiones M debían manipular , pero la primera implementación de Lisp fue un intérprete de expresiones S en el que se pretendía traducir las expresiones M, y los programadores de Lisp pronto se acostumbraron a usar S -expresiones como datos. , y para el código.

Las expresiones S pueden ser objetos individuales (átomos) como números, símbolo (Lisp) , incluidos los caracteres especiales nily t, o pares de puntos , en la forma (x . y). Las listas más largas de pares de puntos anidados, como (1 . (2 . (3 . nil))), se pueden escribir de la forma más familiar, como (1 2 3). Las listas anidadas también se pueden escribir como expresiones S: ((молоко сок) (мёд мармелад)). Las expresiones S son independientes de espacios y saltos de línea, los espacios se usan solo como delimitadores entre átomos.

Ejemplo: una gramática simple en forma de expresión S [2] :

((( S ) ( NP ) ( VP )) (( VP ) ( V )) (( VP ) ( V ) ( NP )) (( V ) murió ) (( V ) empleado ) (( NP ) enfermeras ) ( ( NP ) pacientes ) (( NP ) Medicenter ) (( NP ) Dr. Chan ))

El código del programa también se puede escribir como una expresión S (usualmente usando notación de prefijo). Una pequeña pieza de azúcar sintáctica para escribir programas Lisp es que una expresión de uso común (quote x)se puede abreviar'x

Ejemplo común de Lisp :

( defun factorial ( x ) ( if ( zerop x ) 1 ( * x ( factorial ( - x 1 )))))

Ejemplo en Esquema :

( define ( factorial x ) ( si ( cero? x ) 1 ( * x ( factorial ( - x 1 )))))

Las expresiones S en Lisp se leen usando la función READ. Esta función lee la representación textual de la expresión S y devuelve los datos Lisp. La función IMPRIMIR se puede utilizar para imprimir una expresión S. Lo que PRINT devuelve se puede leer usando la función READ, siempre que todos los objetos de datos de salida tengan una representación de E/S. Lisp tiene esta representación para números, cadenas, caracteres, listas y muchos más tipos de datos. El código del programa se puede representar como una expresión S con un formato limpio (bastante impreso) usando la función PPRINT.

Los programas Lisp son expresiones S válidas, pero no todas las expresiones S son programas Lisp válidos. (1.0 + 3.1) es una expresión S válida, pero no un programa Lisp válido, Lisp usa notación de prefijo, por lo que el número de punto flotante (1.0) no puede reconocerse como una operación (el primer elemento de la expresión).

Estandarización

En mayo de 1997, Ronald Rivest propuso el Borrador de Internet 3] un nuevo RFC El proyecto definió una sintaxis basada en las expresiones S de Lisp, pero pensada para el almacenamiento e intercambio de datos de propósito general similar a XML , en lugar de para la programación. Nunca fue aprobado como RFC, pero desde entonces ha sido citado y utilizado por otros RFC (p. ej., RFC 2693 ) y otras publicaciones. [4] Originalmente fue diseñado para su uso en el SPKI .

El formato Rivest define una expresión S como una cadena de octetos (una serie de bytes ) o una lista finita de otras expresiones S. Describe tres formatos de intercambio para expresiones con esta estructura. Uno de ellos, "transporte avanzado", es bastante flexible en términos de formato y es sintácticamente similar a las expresiones de estilo Lisp, pero no es idéntico. La representación de transporte extendida, por ejemplo, permite que las cadenas de octetos se representen palabra por palabra (la longitud de la cadena, luego dos puntos y la cadena completa "tal cual"), lo que evita la representación de caracteres, hexadecimal o base64 , una cadena de octetos puede ser colocado directamente como un "token". ” si cumple ciertas condiciones. Los tokens de Rivest difieren de los tokens de Lisp en que existen simplemente por conveniencia y estética, y se tratan de la misma manera que otras cadenas, en lugar de tener un significado sintáctico específico. Otro formato de intercambio, destinado a ser más compacto, más fácil de analizar y único para cualquier expresión S abstracta, es la "notación canónica", que solo permite cadenas textuales y no permite espacios como elementos de formato fuera de las cadenas. Finalmente, existe la "representación de transporte básica" que es la forma canónica o los mismos elementos codificados en Base64 entre paréntesis , este último sirve como un transporte seguro para expresiones S codificadas canónicamente en un sistema que permite la modificación de espacios en blanco (p. un sistema de correo que tiene líneas de 80 líneas de ancho superpuestas en algo más largo).

Este formato no ha sido ampliamente adoptado para su uso fuera del SPKI. Rivest, en su página web de S-expressions, proporciona el código fuente C para un analizador y un generador que teóricamente podrían usarse en otros programas, aunque la licencia de estos programas no está clara. Sin embargo, no hay restricciones en las implementaciones independientes de este formato. Se puede encontrar una implementación gratuita en sexpr.sf.net y leon.bottou.org/projects/minilisp .

Véase también

Notas

  1. McCarthy, 1960 .
  2. Gazdar / MelisH, Procesamiento del lenguaje natural en Lisp
  3. Copia archivada (enlace no disponible) . Consultado el 5 de febrero de 2010. Archivado desde el original el 1 de diciembre de 2008. 
  4. rivest sex - Google Académico

Literatura