En programación informática , las M-expresiones (o meta-expresiones ) fueron una sintaxis propuesta en un principio para el lenguaje de programación Lisp , inspirada en lenguajes contemporáneos como Fortran y ALGOL . La notación nunca se implementó en el lenguaje y, como tal, nunca se finalizó. [1]
Las expresiones M son una sintaxis para el código LISP y proporcionan notación de funciones , sintaxis para un cond
formulario y para datos literales incrustados (a través de expresiones S) en los programas. Por lo tanto, las expresiones M utilizan expresiones S para datos literales. La sintaxis para expresiones S ("El lenguaje de datos") y expresiones M ("El metalenguaje") se define en las páginas 8 y 9 del manual de Lisp 1.5. [2]
Las expresiones M también tenían una representación correspondiente en expresiones S. El código se traducía manualmente de expresiones M a expresiones S. Los datos literales incrustados en las expresiones M debían incluirse entre comillas en las expresiones S.
La forma M-Expresión
append[listvar;(PARÍS BERLÍN NUEVAYORK TOKIO)]
Luego debe transformarse a la forma S-Expresión
(AGREGAR LISTA (CITA (PARÍS BERLÍN NUEVA YORK TOKIO)))
John McCarthy publicó el primer artículo sobre Lisp en 1960 mientras era investigador en el Instituto Tecnológico de Massachusetts . En él describió un lenguaje de expresiones simbólicas ( S-expresiones ) que podía representar estructuras complejas como listas. Luego definió un conjunto de operaciones primitivas sobre las S-expresiones y un lenguaje de meta-expresiones (M-expresiones) que podía usarse para definir operaciones más complejas. Finalmente, mostró cómo el propio metalenguaje podía representarse con S-expresiones, lo que dio como resultado un sistema que era potencialmente autoalojado . [3] La versión preliminar de este artículo se conoce como "AI Memo 8". [4]
McCarthy había planeado desarrollar un compilador automático de Lisp ( LISP 2 ) utilizando expresiones M como sintaxis del lenguaje y expresiones S para describir los procesos internos del compilador. Stephen B. Russell leyó el artículo y le sugirió que las expresiones S eran una sintaxis más conveniente. Aunque McCarthy desaprobó la idea, Russell y su colega Daniel J. Edwards codificaron a mano un programa intérprete que pudiera ejecutar expresiones S. [2] Este programa fue adoptado por el grupo de investigación de McCarthy, estableciendo las expresiones S como la forma dominante de Lisp.
McCarthy reflexionó sobre el destino de las expresiones M en 1979:
El proyecto de definir expresiones M con precisión y compilarlas o al menos traducirlas a expresiones S no se finalizó ni se abandonó explícitamente. Simplemente quedó relegado a un futuro indefinido y apareció una nueva generación de programadores que preferían la notación interna a cualquier notación tipo FORTRAN o ALGOL que pudiera concebirse. [5]
— Historia de Lisp
El libro Anatomía de LISP de John Allen explica la definición de expresiones M y las utiliza a lo largo del libro para explicar Lisp y su implementación. [6]
Las definiciones de las funciones apply y eval del Manual de Lisp 1.5, página 13.
aplicar[fn;x;a] = [átomo[fn] → [eq[fn;CAR] → caar[x]; eq[fn;CDR] → cdar[x]; eq[fn;CONS] → cons[car[x];cadr[x]]; eq[fn;ÁTOMO] → átomo[car[x]]; eq[fn;EQ] → eq[car[x];cadr[x]]; T → aplicar[eval[fn;a];x;a]]; eq[car[fn];LAMBDA] → eval[caddr[fn];parlis[cadr[fn];x;a]]; eq[car[fn];ETIQUETA] → aplicar[caddr[fn];x;cons[cons[cadr[fn];caddr[fn]];a]]]
evaluar[e;a] = [átomo[e] → cdr[asociado[e;a]]; átomo[coche[e]] → [eq[coche[e],CITA] → cadr[e]; eq[car[e];COND] → evcon[cdr[e];a]; T → aplicar[car[e];evlis[cdr[e];a];a]]; T → aplicar[car[e];evlis[cdr[e];a];a]]
Usando la función eval en una expresión s.
eval[(EQ (CITA A) (CAR (CONS (CITA A) (CITA (BCD)))));NIL]
MLisp fue un proyecto contemporáneo (1968-1973) para implementar una interfaz de usuario similar a las expresiones M para Lisp. Se incorporaron algunas características adicionales como macros higiénicas , coincidencia de patrones y retroceso . Con el tiempo, evolucionó hasta convertirse en un borrador abandonado de LISP70. M-LISP (MetaLISP) de 1989 fue otro intento de combinar las expresiones M con Scheme. [7]
Hay disponible en Common Lisp un analizador para la expresión M " AI Memo 8" , pero el autor lo utiliza como argumento contra las expresiones M debido a su aparente incapacidad para manejar macros. [8]
Se implementó un CGOL (1977) en MacLisp y sigue un objetivo similar de introducir una sintaxis similar a Algol con operadores infijos. [7] Se sabe que funciona en Armed Bear Common Lisp . [9]
Una variante más reciente (circa 2003) es la expresión I , que utiliza sangría para indicar paréntesis implícitamente y, por lo tanto, en cierto modo son intermedias entre las expresiones S y las expresiones M. Las expresiones I se introdujeron en Scheme Request For Implementation 49 como una sintaxis auxiliar para Scheme , pero no se han adoptado ampliamente. [10]
Un desarrollo posterior es la expresión t "dulce" , que tiene operadores infijos sin precedencia. Al igual que las expresiones I, las expresiones t son sólo una transformación simple de las expresiones S, de modo que teóricamente se pueden usar en cualquier dialecto Lisp y no interfieren con funciones como las macros. [11]
Otras sintaxis relacionadas incluyen Dylan de Apple (tokens similares a Algol) y la incorporación de otras sintaxis literales por parte de Clojure . [7]
Los principiantes pueden probarlas y ver lo poco prácticas que son. Observen, por ejemplo, que ya no podemos usar macros porque el analizador de expresiones M tendría que conocer su sintaxis.