En programación informática , las expresiones M (o metaexpresiones ) fueron una de las primeras sintaxis propuestas para el lenguaje de programación Lisp , inspiradas en lenguajes contemporáneos como Fortran y ALGOL . La notación nunca se implementó en el idioma y, como tal, nunca se finalizó. [1]
En comparación con las expresiones S, las expresiones M introducen notación de funciones , operadores infijos (incluido un defun
operador) y abreviaturas para cond
y list
en el lenguaje. [2]
Fondo
John McCarthy publicó el primer artículo sobre Lisp en 1960 mientras era investigador en el Instituto de Tecnología de Massachusetts . En él describió un lenguaje de expresiones simbólicas ( expresiones-S ) que podrían representar estructuras complejas como listas. Luego definió un conjunto de operaciones primitivas en las expresiones S y un lenguaje de metaexpresiones (expresiones M) que podrían usarse para definir operaciones más complejas. Finalmente, mostró cómo el metalenguaje en sí mismo podría representarse con expresiones S, lo que resultó en un sistema que era potencialmente autohospedado . [3] La versión preliminar de este documento se conoce como "AI Memo 8". [4]
Tipo de expresión | Notación matemática | Expresión M | Expresión S moderna de Lisp |
---|---|---|---|
Valor de lista | [1; 2; 3] | (quote (1 2 3)) | |
Aplicación de función | f [x; y] | (f x y) | |
Definición de función | etiqueta [cuadrado; λ [[x]; multiplicado por [x; x]]] | (define square (lambda (x) (* x x))) | |
Expresión condicional | [menosp [x; 0] → menos [x]; T → x] | (cond ((< x 0) (- x)) (t x)) |
McCarthy había planeado desarrollar un compilador Lisp automático ( LISP 2 ) usando 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 manualmente un programa de intérprete que podía 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 fue finalizado ni abandonado explícitamente. Simplemente retrocedió hacia el futuro indefinido, y apareció una nueva generación de programadores que prefirieron la notación interna a cualquier notación similar a FORTRAN o ALGOL que pudiera idearse. [5]
Implementaciones
Una forma de expresiones M azucaradas se ha implementado en el lenguaje Wolfram de Wolfram Mathematica desde 1988:
Tipo de expresión | Sintaxis azucarada (InputForm) | Forma de función (FullForm) |
---|---|---|
Valor de lista | {1, 2, 3} | List[1, 2, 3] |
Aplicación de función | f[x, y] | f[x, y] |
Definición de función |
|
|
(Los condicionales requieren más de explicación, ya que el sistema condicional general en el lenguaje se basa en la coincidencia y reescritura de patrones ). [6]
Para LISP
MLisp fue un proyecto contemporáneo (1968-1973) para implementar una interfaz similar a una expresión M para Lisp. Se incorporaron algunas características adicionales como macros higiénicas , coincidencia de patrones y retroceso. Eventualmente se convirtió en un borrador LISP70 abandonado. M-LISP (MetaLISP) de 1989 fue otro intento de combinar expresiones M con Scheme. [7]
Un analizador para la expresión M "AI Memo 8" está disponible en Common Lisp , pero el autor lo pretende como un caso contra las expresiones M debido a su incapacidad percibida para hacer frente a macros. [8]
Mayor desarrollo
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 trabaja en Armed Bear Common Lisp . [9]
Una variante más reciente (alrededor de 2003) es la expresión I , que usa sangría para indicar paréntesis implícitamente y, por lo tanto, de alguna manera es intermedia 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 han sido ampliamente adoptadas. [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 solo una transformación simple de las expresiones S, por lo que teóricamente se pueden usar en cualquier dialecto Lisp y no interferir con características como macros. [11]
La sintaxis adicional relacionada incluye Dylan de Apple (tokens tipo Algol) y la adición de Clojure de otras sintaxis literales. [7]
Referencias
- ^ "La implementación de LISP" . www-formal.stanford.edu . Consultado el 29 de marzo de 2020 .
- ^ a b c "Manual del programador LISP 1.5" (PDF) . Community.computerhistory.org. 1965. Archivado desde el original (PDF) el 11 de febrero de 2006 . Consultado el 2 de septiembre de 2013 .
- ^ McCarthy, John (abril de 1960) "Funciones recursivas de expresiones simbólicas y su cálculo por máquina, parte I"
- ^ McCarthy, John (marzo de 1959). "Funciones recursivas de expresiones simbólicas y su cálculo por máquina (AI Memo 8)" .
- ^ "La implementación de LISP" . Formal.stanford.edu. 1979-02-12 . Consultado el 24 de agosto de 2013 .
- ^ Mathematica como lenguaje de reescritura .
- ^ a b c Lee, Xah. "Encuesta de sintaxis LISP Infix" .
- ^ "Un analizador de expresiones M" .
Dejemos que los novatos jueguen con ellos y nos demos cuenta de lo poco prácticos que son. Tenga en cuenta, por ejemplo, que ya no podemos usar macros porque el analizador de expresiones M debería conocer su sintaxis.
- ^ CGOL en ABCL Desarrollo del blog de implementación Armed Bear Common Lisp .
- ^ Möller, Egil (2003). "SRFI 49: sintaxis sensible a la sangría" . srfi.schemers.org .
- ^ Wheeler, DA (2013). "SRFI 110: Expresiones dulces (expresiones-t)" . srfi.schemers.org .