
En programación informática , una macro (abreviatura de " instrucción macro "; del griego μακρο - ' largo, grande ' [ 1 ] ) es una regla o patrón que especifica cómo se debe asignar una entrada determinada a una salida de reemplazo. Aplicar una macro a una entrada se conoce como expansión de macro .
La entrada y la salida pueden ser una secuencia de tokens léxicos o caracteres , o un árbol sintáctico . Las aplicaciones de software admiten macros de caracteres para facilitar la invocación de secuencias de comandos comunes . Algunos lenguajes de programación admiten macros de tokens y de árbol para permitir la reutilización de código o para extender el lenguaje, a veces para lenguajes específicos de dominio .
Las macros se utilizan para poner a disposición del programador una secuencia de instrucciones de computación como una sola instrucción de programa , lo que hace que la tarea de programación sea menos tediosa y menos propensa a errores. [ 2 ] [ 3 ] Por lo tanto, se llaman "macros" porque un "gran" bloque de código puede expandirse a partir de una "pequeña" secuencia de caracteres. Las macros a menudo permiten parámetros posicionales o de palabras clave que dictan lo que genera el programa ensamblador condicional y se han utilizado para crear programas completos o conjuntos de programas según variables como el sistema operativo , la plataforma u otros factores. El término deriva de "instrucción macro", y dichas expansiones se utilizaron originalmente para generar código en lenguaje ensamblador .
Macros de teclado y ratón
Las macros de teclado y ratón permiten transformar secuencias cortas de pulsaciones de teclas y acciones del ratón en otras secuencias más largas y complejas. De esta forma, se pueden automatizar secuencias frecuentes o repetitivas de pulsaciones de teclas y movimientos del ratón . Los programas específicos para crear estas macros se denominan grabadores de macros .
Durante la década de 1980, los programas de macros —inicialmente SmartKey , luego SuperKey, KeyWorks y Prokey— fueron muy populares, primero para formatear guiones automáticamente y después para diversas tareas de entrada de datos por parte del usuario. Estos programas se basaban en el modo de operación de terminación y permanencia , y se aplicaban a todas las entradas de teclado, independientemente del contexto. En cierta medida, han quedado obsoletos tras la llegada de las interfaces de usuario controladas por ratón y la disponibilidad de macros de teclado y ratón en aplicaciones como procesadores de texto y hojas de cálculo , lo que permite crear macros de teclado específicas para cada aplicación.
En los juegos de rol multijugador masivos en línea (MMORPG) , se pueden usar macros de teclado para realizar tareas repetitivas pero lucrativas, acumulando así recursos. Dado que esto se realiza sin esfuerzo humano, puede distorsionar la economía del juego. Por esta razón, el uso de macros constituye una violación de los Términos de Servicio o del Contrato de Licencia de Usuario Final de la mayoría de los MMORPG, y sus administradores dedican considerables esfuerzos a suprimirlas. [ 4 ]
Macros y secuencias de comandos para aplicaciones
Las macros de teclado y ratón creadas mediante las funciones de macros integradas de una aplicación se denominan a veces macros de aplicación . Se crean ejecutando la secuencia una sola vez y permitiendo que la aplicación registre las acciones. También puede existir un lenguaje de programación de macros subyacente, generalmente un lenguaje de scripting , con acceso directo a las funciones de la aplicación.
El editor de texto para programadores Emacs (abreviatura de "editar macros") lleva esta idea al extremo. De hecho, la mayor parte del editor está compuesta por macros. Emacs fue concebido originalmente como un conjunto de macros en el lenguaje de edición TECO ; posteriormente se adaptó a dialectos de Lisp .
Otro editor de texto para programadores, Vim (descendiente de vi ), también implementa macros de teclado. Puede grabar en un registro (macro) lo que una persona escribe en el teclado y reproducirlo o editarlo como las macros VBA de Microsoft Office. Vim también cuenta con un lenguaje de scripting llamado Vimscript [ 5 ] para crear macros.
Visual Basic para Aplicaciones (VBA) es un lenguaje de programación incluido en Microsoft Office desde Office 97 hasta Office 2019 (aunque ya estaba disponible en algunos componentes de Office antes de Office 97). Sin embargo, su funcionalidad ha evolucionado y ha reemplazado a los lenguajes de macros que originalmente se incluían en algunas de estas aplicaciones.
XEDIT , que se ejecuta en el componente Conversational Monitor System (CMS) de VM , admite macros escritas en EXEC , EXEC2 y REXX , y algunos comandos de CMS eran en realidad envoltorios para macros de XEDIT. El editor Hessling (THE), un clon parcial de XEDIT, admite macros Rexx mediante Regina y Open Object REXX (oorexx). Muchas aplicaciones comunes, y algunas en PC, utilizan Rexx como lenguaje de scripting.
Macrovirus
VBA tiene acceso a la mayoría de las llamadas al sistema de Microsoft Windows y se ejecuta al abrir documentos. Esto facilita la creación de virus informáticos en VBA, comúnmente conocidos como virus de macro . A mediados y finales de la década de 1990, este se convirtió en uno de los tipos de virus informáticos más comunes. Sin embargo, desde finales de la década de 1990 hasta la actualidad, Microsoft ha estado actualizando y corrigiendo vulnerabilidades en sus programas. Además, los programas antivirus actuales contrarrestan inmediatamente este tipo de ataques.
Macro parametrizada y sin parámetros
Una macro parametrizada es una macro que puede insertar objetos específicos en su expansión. Esto le otorga a la macro parte del poder de una función .
Como ejemplo sencillo, en el lenguaje de programación C , esta es una macro típica que no es una macro parametrizada, es decir, una macro sin parámetros :
#define PI 3.14159
Esto provoca PIque siempre se reemplace 3.14159dondequiera que aparezca. Un ejemplo de una macro parametrizada, por otro lado, es este:
#define pred(x) ((x)-1)
La expansión de esta macro depende del argumento x que se le pase. Aquí hay algunas posibles expansiones:
pred(2) → ((2) -1) pred(y+2) → ((y+2) -1) pred(f(5)) → ((f(5))-1)
Las macros parametrizadas son un mecanismo útil a nivel de código fuente para realizar la expansión en línea , pero en lenguajes como C , donde utilizan una simple sustitución textual, tienen una serie de desventajas graves en comparación con otros mecanismos para realizar la expansión en línea, como las funciones en línea .
Por otro lado, las macros parametrizadas utilizadas en lenguajes como Lisp , PL/I y Scheme son mucho más potentes, capaces de tomar decisiones sobre qué código producir en función de sus argumentos; por lo tanto, pueden utilizarse eficazmente para generar código en tiempo de ejecución .
Macros de sustitución de texto
Lenguajes como C y algunos lenguajes ensamblador cuentan con sistemas de macros rudimentarios, implementados como preprocesadores para el compilador o el ensamblador. Las macros del preprocesador de C funcionan mediante una simple sustitución textual a nivel de token , en lugar de a nivel de carácter. Sin embargo, las funcionalidades de macros de ensambladores más sofisticados, como IBM High Level Assembler (HLASM), no pueden implementarse con un preprocesador; el código para ensamblar instrucciones y datos se intercala con el código para ensamblar invocaciones de macros.
Un uso clásico de las macros se encuentra en el sistema de composición tipográfica TeX y sus derivados, donde la mayor parte de la funcionalidad se basa en macros. [ 6 ]
MacroML es un sistema experimental que busca conciliar el tipado estático y los sistemas de macros. Nemerle tiene macros de sintaxis tipadas, y una forma productiva de pensar en estas macros de sintaxis es como un cálculo de múltiples etapas .
Otros ejemplos:
- m4 es un sofisticado procesador de macros independiente.
- TRAC
- Extensión de macro TAL , lenguaje de atributos de plantilla que la acompaña
- SMX: para páginas web
- ML/1 (Lenguaje de macros uno)
- troff y nroff : para la composición tipográfica y el formato de las páginas de manual de Unix.
- CMS EXEC : para macros de línea de comandos y macros de aplicación
- EXEC 2 en el Sistema de Monitorización Conversacional (CMS): para macros de línea de comandos y macros de aplicación.
- CLIST en la opción de tiempo compartido (TSO) de IBM : para macros de línea de comandos y macros de aplicación.
- REXX : para macros de línea de comandos y macros de aplicación en, por ejemplo, AmigaOS , CMS, OS/2 , TSO
- SCRIPT : para formatear documentos
- Diversos intérpretes de comandos para, por ejemplo, Linux
Algunas aplicaciones importantes se han escrito como macros de texto invocadas por otras aplicaciones, por ejemplo, por XEDIT en CMS.
Lenguajes integrables
Algunos lenguajes, como PHP , pueden incrustarse en texto de formato libre o en el código fuente de otros lenguajes. El mecanismo mediante el cual se reconocen los fragmentos de código (por ejemplo, al estar entre corchetes <?phpy ?>) es similar al de un lenguaje de macros textual, pero son lenguajes mucho más potentes y completos.
Macros procedimentales
Las macros en el lenguaje PL/I se escriben en un subconjunto del propio PL/I: el compilador ejecuta instrucciones de preprocesador durante la compilación, y el resultado de esta ejecución forma parte del código compilado. La posibilidad de usar un lenguaje procedimental conocido como lenguaje de macros proporciona una potencia mucho mayor que la de las macros de sustitución de texto, aunque a costa de un compilador más grande y lento. Las macros en PL/I, al igual que en muchos ensambladores, pueden tener efectos secundarios , como por ejemplo, modificar variables a las que otras macros pueden acceder.
Las macros de marco de la tecnología de marcos tienen su propia sintaxis de comandos, pero también pueden contener texto en cualquier idioma. Cada marco es a la vez un componente genérico en una jerarquía de subconjuntos anidados y un procedimiento para integrarse con los marcos de sus subconjuntos (un proceso recursivo que resuelve los conflictos de integración a favor de los subconjuntos de nivel superior). Los resultados son documentos personalizados, generalmente módulos fuente compilables. La tecnología de marcos puede evitar la proliferación de componentes similares pero sutilmente diferentes, un problema que ha afectado al desarrollo de software desde la invención de las macros y las subrutinas .
La mayoría de los lenguajes ensamblador tienen funcionalidades de macros procedimentales menos potentes, por ejemplo, permiten que un bloque de código se repita N veces para desenrollar un bucle ; pero estas tienen una sintaxis completamente diferente a la del lenguaje ensamblador propiamente dicho.
Macros sintácticas
Los sistemas de macros —como el preprocesador de C descrito anteriormente— que operan a nivel de tokens léxicos no pueden preservar la estructura léxica de forma fiable. Los sistemas de macros sintácticos, en cambio, operan a nivel de árboles de sintaxis abstracta y preservan la estructura léxica del programa original. Las implementaciones más utilizadas de sistemas de macros sintácticos se encuentran en lenguajes tipo Lisp . Estos lenguajes son especialmente adecuados para este estilo de macros debido a su sintaxis uniforme entre paréntesis (conocida como expresiones S ). En particular, la sintaxis uniforme facilita la identificación de las invocaciones de macros. Las macros de Lisp transforman la estructura del programa, y el lenguaje completo está disponible para expresar dichas transformaciones. Aunque las macros sintácticas se encuentran a menudo en lenguajes tipo Lisp, también están disponibles en otros lenguajes como Prolog , [ 7 ] Erlang , [ 8 ] Dylan , [ 9 ] Scala , [ 10 ] Nemerle , [ 11 ] Rust , [ 12 ] Elixir , [ 13 ] Nim , [ 14 ] Haxe , [ 15 ] y Julia . [ 16 ] También están disponibles como extensiones de terceros para JavaScript [ 17 ] y C# . [ 18 ]
Macros antiguas de Lisp
Antes de que Lisp tuviera macros, tenía los llamados FEXPR , operadores similares a funciones cuyas entradas no eran los valores calculados por los argumentos, sino las formas sintácticas de estos, y cuya salida eran valores que se usarían en el cálculo. En otras palabras, los FEXPR se implementaban al mismo nivel que EVAL y proporcionaban una ventana a la capa de metaevaluación. Generalmente se consideraba que este era un modelo difícil de comprender eficazmente. [ 19 ]
En 1963, Timothy Hart propuso agregar macros a Lisp 1.5 en AI Memo 57: MACRO Definitions for LISP. [ 20 ]
macros anafóricas
Una macro anafórica es un tipo de macro de programación que captura deliberadamente una forma proporcionada a la macro, la cual puede ser referenciada por una anáfora (una expresión que alude a otra). Las macros anafóricas aparecieron por primera vez en el libro "On Lisp" de Paul Graham, y su nombre hace referencia a la anáfora lingüística: el uso de palabras como sustituto de palabras precedentes.
macros higiénicas
A mediados de los años ochenta, varios artículos [ 21 ] [ 22 ] introdujeron la noción de expansión de macro higiénicasyntax-rules ( ), un sistema basado en patrones donde los entornos sintácticos de la definición de la macro y el uso de la macro son distintos, lo que permite a los definidores y usuarios de macros no preocuparse por la captura inadvertida de variables (cf. transparencia referencial ). Las macros higiénicas se han estandarizado para Scheme en los estándares R5RS , R6RS y R7RS . Existen varias implementaciones competitivas de macros higiénicas como syntax-rules, syntax-case, el renombramiento explícito y los cierres sintácticos. Tanto syntax-rulescomo syntax-casese han estandarizado en los estándares Scheme.
Recientemente, Racket ha combinado las nociones de macros higiénicas con una "torre de evaluadores", de modo que el tiempo de expansión sintáctica de un sistema de macros es el tiempo de ejecución ordinario de otro bloque de código, [ 23 ] y mostró cómo aplicar expansión y análisis intercalados en un lenguaje sin paréntesis. [ 24 ]
Otros lenguajes, además de Scheme, implementan macros higiénicas o sistemas parcialmente higiénicos. Algunos ejemplos son Scala , Rust , Elixir , Julia , Dylan , Nim y Nemerle .
Aplicaciones
- Orden de evaluación
- Los sistemas de macros tienen diversas aplicaciones. La posibilidad de elegir el orden de evaluación (véase evaluación perezosa y funciones no estrictas ) permite crear nuevas construcciones sintácticas (por ejemplo, estructuras de control ) indistinguibles de las integradas en el lenguaje. Por ejemplo, en un dialecto de Lisp que tiene
condpero carece deif, es posible definir este último en función del primero mediante macros. Por ejemplo, Scheme cuenta con continuaciones y macros higiénicas, lo que permite al programador diseñar sus propias abstracciones de control, como bucles y construcciones de salida temprana, sin necesidad de integrarlas en el lenguaje. - Sublenguajes de datos y lenguajes específicos de dominio
- A continuación, las macros permiten definir lenguajes de datos que se compilan inmediatamente en código, lo que significa que construcciones como las máquinas de estados pueden implementarse de una manera natural y eficiente. [ 25 ]
- Estructuras de unión
- Las macros también pueden utilizarse para introducir nuevas estructuras de enlace. El ejemplo más conocido es la transformación de
leten la aplicación de una función a un conjunto de argumentos.
Felleisen conjetura [ 26 ] que estas tres categorías constituyen los usos legítimos primarios de las macros en un sistema de este tipo. Otros han propuesto usos alternativos de las macros, como las macros anafóricas en sistemas macro que son antihigiénicos o permiten una transformación selectiva antihigiénica.
La interacción entre macros y otras características del lenguaje ha sido un área de investigación muy productiva. Por ejemplo, los componentes y módulos son útiles para la programación a gran escala, pero es necesario definir la interacción entre las macros y estas otras construcciones para su uso conjunto. Se han propuesto sistemas de módulos y componentes que pueden interactuar con macros para Scheme y otros lenguajes que las utilizan. Por ejemplo, el lenguaje Racket extiende la noción de sistema de macros a una estructura sintáctica compleja, donde las macros se pueden escribir en lenguajes que las incluyen, utilizando criterios de higiene para garantizar la distinción entre las capas sintácticas y permitiendo que los módulos exporten macros a otros módulos.
Macros para software independiente de la máquina
Las macros se utilizan normalmente para asignar una cadena corta (invocación de macro) a una secuencia más larga de instrucciones. Otro uso menos común de las macros es el inverso: asignar una secuencia de instrucciones a una cadena de macro. Este fue el enfoque adoptado por el sistema de programación móvil STAGE2 , que utilizó un compilador de macros rudimentario (llamado SIMCMP) para asignar el conjunto de instrucciones específico de un ordenador determinado a macros independientes de la máquina . Las aplicaciones (en particular, los compiladores) escritas en estas macros independientes de la máquina pueden ejecutarse sin modificaciones en cualquier ordenador equipado con el compilador de macros rudimentario. La primera aplicación que se ejecuta en este contexto es un compilador de macros más sofisticado y potente, escrito en el lenguaje de macros independiente de la máquina. Este compilador de macros se aplica a sí mismo, de forma autoarrancable , para producir una versión compilada y mucho más eficiente. La ventaja de este enfoque es que las aplicaciones complejas pueden portarse de un ordenador a otro muy diferente con muy poco esfuerzo (para cada arquitectura de máquina de destino, solo es necesario escribir el compilador de macros rudimentario). [ 27 ] [ 28 ] La llegada de los lenguajes de programación modernos, especialmente C , para los cuales existen compiladores en prácticamente todos los ordenadores, ha hecho que tal enfoque sea superfluo. Sin embargo, este fue uno de los primeros casos (si no el primero) de arranque del compilador .
lenguaje ensamblador
Aunque las instrucciones macro pueden ser definidas por un programador para cualquier conjunto de instrucciones de programa de ensamblador nativo, normalmente las macros están asociadas con bibliotecas de macros entregadas con el sistema operativo que permiten el acceso a funciones del sistema operativo como
- Acceso periférico mediante métodos de acceso (incluidas macros como OPEN, CLOSE, READ y WRITE)
- funciones del sistema operativo como ATTACH, WAIT y POST para la creación y sincronización de subtareas. [ 29 ] Normalmente, dichas macros se expanden en código ejecutable, por ejemplo, para la macroinstrucción EXIT,
- una lista de instrucciones de definición constante , por ejemplo, para la macro DCB —DTF (Define The File) para DOS [ 30 ] —o una combinación de código y constantes, con los detalles de la expansión dependiendo de los parámetros de la instrucción de la macro (como una referencia a un archivo y un área de datos para una instrucción READ);
- El código ejecutable solía finalizar mediante una instrucción de registro de enlace y bifurcación para llamar a una rutina, o mediante una instrucción de llamada al supervisor para llamar directamente a una función del sistema operativo.
- Generación de un flujo de trabajo de Etapa 2 para la generación del sistema en, por ejemplo, OS/360 . A diferencia de las macros típicas, las macros de etapa 1 de sysgen no generan datos ni código para cargar en el almacenamiento, sino que utilizan la instrucción PUNCH para generar JCL y los datos asociados.
En los sistemas operativos más antiguos, como los utilizados en los ordenadores centrales de IBM, la funcionalidad completa del sistema operativo solo estaba disponible para los programas escritos en lenguaje ensamblador, no para los programas escritos en lenguajes de alto nivel (a menos que se utilizaran subrutinas en lenguaje ensamblador, por supuesto), ya que las instrucciones macro estándar no siempre tenían equivalentes en las rutinas disponibles para los lenguajes de alto nivel.
Historia
A mediados de la década de 1950, cuando la programación en lenguaje ensamblador era la principal forma de programar una computadora , se desarrollaron las características de las macroinstrucciones para reducir el código fuente (generando múltiples sentencias de ensamblador a partir de cada macroinstrucción) y para imponer convenciones de codificación (por ejemplo, especificando comandos de entrada/salida de forma estandarizada). [ 31 ] Una macroinstrucción incrustada en el código fuente, que de otro modo sería ensamblador, sería procesada por un compilador de macros, un preprocesador del ensamblador, para reemplazar la macro con una o más instrucciones de ensamblador. El código resultante, ensamblador puro, sería traducido a código máquina por el ensamblador. [ 32 ]
Dos de las primeras instalaciones de programación que desarrollaron lenguajes de macros para el ordenador IBM 705 se encontraban en Dow Chemical Corp. en Delaware y en la Oficina de Logística de Misiles Balísticos del Comando de Material Aéreo en California.
Algunos consideran las macroinstrucciones como un paso intermedio entre la programación en lenguaje ensamblador y los lenguajes de programación de alto nivel que le siguieron, como FORTRAN y COBOL .
A finales de la década de 1950, el lenguaje de macros fue seguido por los ensambladores de macros . Esto fue una combinación de ambos donde un programa cumplía ambas funciones, la de un preprocesador de macros y un ensamblador en el mismo paquete. [ 32 ] Los primeros ejemplos son el programa de ensamblaje FORTRAN (FAP) [ 33 ] y el programa de ensamblaje de macros (IBMAP) [ 34 ] en los IBM 709 , 7094 , 7040 y 7044, y Autocoder [ 35 ] en los 7070/7072/7074 .
En 1959, Douglas E. Eastwood y Douglas McIlroy de Bell Labs introdujeron macros condicionales y recursivas en el popular ensamblador SAP , [ 36 ] creando lo que se conoce como Macro SAP. [ 37 ] El artículo de McIlroy de 1960 fue fundamental en el área de la extensión de cualquier lenguaje de programación (incluidos los de alto nivel ) a través de procesadores de macros . [ 38 ] [ 36 ]
Los ensambladores de macros permitieron a los programadores de lenguaje ensamblador implementar su propio lenguaje de macros y facilitaron una portabilidad limitada del código entre dos máquinas con la misma CPU pero sistemas operativos diferentes, como por ejemplo, las primeras versiones de MS-DOS y CP/M-86 . La biblioteca de macros debía escribirse para cada máquina de destino, pero no el programa completo en lenguaje ensamblador. Cabe destacar que los ensambladores de macros más potentes permitieron el uso de construcciones de ensamblaje condicional en las instrucciones de macros, lo que podía generar código diferente en distintas máquinas o sistemas operativos, reduciendo así la necesidad de múltiples bibliotecas.
En los años ochenta y principios de los noventa, los ordenadores de sobremesa apenas alcanzaban unos pocos MHz, y las rutinas en lenguaje ensamblador se utilizaban habitualmente para acelerar programas escritos en C, Fortran, Pascal y otros. En aquel entonces, estos lenguajes empleaban convenciones de llamada diferentes. Las macros podían utilizarse para conectar rutinas escritas en lenguaje ensamblador con la interfaz de aplicaciones escritas en prácticamente cualquier lenguaje. De nuevo, el código básico en lenguaje ensamblador permanecía invariable; solo era necesario escribir las bibliotecas de macros para cada lenguaje de destino.
En los sistemas operativos modernos, como Unix y sus derivados, el acceso al sistema operativo se proporciona mediante subrutinas, generalmente proporcionadas por bibliotecas dinámicas. Los lenguajes de alto nivel, como C, ofrecen un acceso completo a las funciones del sistema operativo, lo que elimina la necesidad de programas en lenguaje ensamblador para dicha funcionalidad.
Además, las bibliotecas estándar de varios lenguajes de programación más recientes, como Go , desaconsejan activamente el uso de llamadas al sistema en favor de bibliotecas independientes de la plataforma , cuando no son necesarias, para mejorar la portabilidad y la seguridad. [ 39 ]
Véase también
- macro anafórico
- Lenguaje ensamblador § Macros – Antecedentes de las macros
- Operador compuesto : construcción básica del lenguaje de programación. Páginas que muestran breves descripciones de destinos de redirección.
- Programación extensible : estilo de programación informática.
- Operación fusionada : construcción básica del lenguaje de programación. Páginas que muestran breves descripciones de los destinos de redirección.
- Macro higiénica : macros cuya expansión garantiza que no se capturen identificadores.
- Macro y seguridad : regla para sustituir una entrada fija por una salida fija. Páginas que muestran descripciones breves de los destinos de redirección.
- Programación por demostración : técnica para enseñar nuevos comportamientos a un ordenador o a un robot.
- Interpolación de cadenas : reemplazar marcadores de posición en una cadena con valores.
Referencias
- ↑ Oxford English Dictionary , sv macro , macro-instrucción y macro-
- ↑ Greenwald, Irwin D.; Kane, Maureen (abril de 1959). "El sistema Share 709: programación y modificación" . Journal of the ACM . 6 (2). Nueva York, NY, EE. UU.: ACM: 128–133 . doi : 10.1145/320964.320967 . S2CID 27424222. Uno de los usos importantes de las macros de programación es ahorrar tiempo y evitar errores de
tipo administrativo al escribir secuencias de instrucciones que a menudo se repiten en el curso de un programa.
- ↑ Strachey, Christopher (octubre de 1965). "Un macrogenerador de propósito general" . Computer Journal . 8 (3): 225– 241. doi : 10.1093/comjnl/8.3.225 .
- ↑ "Runescape: El juego de aventuras online masivo de Jagex Ltd" . Consultado el 3 de abril de 2008 .
- ↑ "scripts: vim online" . www.vim.org .
- ↑ Fine, Johnathan. "¡TEX para siempre!" (PDF) . Grupo de Usuarios de Tex . pág. 141. Consultado el 6 de diciembre de 2024.
TEX tiene un lenguaje de programación de macros, que permite agregar características.
- ↑ "Macros de Prolog" . www.metalevel.at . Consultado el 5 de abril de 2021 .
- ↑ "Erlang -- Preprocesador" . erlang.org . Consultado el 24 de mayo de 2021 .
- ↑ "El sistema macro de Dylan — Open Dylan" . opendylan.org . Consultado el 5 de abril de 2021 .
- ↑ "Def Macros" . Documentación de Scala . Consultado el 5 de abril de 2021 .
- ↑ "Acerca de - Sitio oficial del lenguaje de programación Nemerle" . nemerle.org . Consultado el 5 de abril de 2021 .
- ↑ "Macros - El lenguaje de programación Rust" . doc.rust-lang.org . Consultado el 5 de abril de 2021 .
- ↑ "Macros" . elixir-lang.github.com . Consultado el 5 de abril de 2021 .
- ↑ "macros" . nim-lang.org . Consultado el 5 de abril de 2021 .
- ↑ "Macros" . Haxe - El kit de herramientas multiplataforma .
- ↑ "Metaprogramación · El lenguaje Julia" . docs.julialang.org . Consultado el 5 de abril de 2021 .
- ↑ "Sweet.js - Macros higiénicas para JavaScript" . www.sweetjs.org .
- ↑ "Página principal de LeMP · C# mejorado" . ecsharp.net .
- ↑ Marshall, Joe. "Correo electrónico sin título" . Consultado el 3 de mayo de 2012 .
- ↑ Hart, Timothy P. (octubre de 1963). "Definiciones MACRO para LISP". AI Memos . hdl : 1721.1/6111 . AIM-057.
- ↑ Kohlbecker, Eugene; Friedman, Daniel; Felleisen, Matthias; Duba, Bruce (1986). «Expansión macro higiénica». LFP '86: Actas de la conferencia ACM de 1986 sobre LISP y programación funcional . págs. 151–161 . doi : 10.1145/319838.319859 . ISBN 0897912004.
- ↑Clinger, Rees. "Macromicros que funcionan"
- ↑ Flatt, Matthew. "Macros componibles y compilables: ¿cuándo las necesitas?" (PDF) .
- ↑ Rafkind, Jon; Flatt, Matthew. "Honu: Extensión sintáctica para la notación algebraica mediante enforestación" (PDF) .
- ↑ «Autómatas vía Macros» . cs.brown.edu .
- ↑Matthias Felleisen, publicación en la lista de correo LL1
- ↑ Orgass, Richard J.; Waite, William M. (septiembre de 1969). "Una base para un sistema de programación móvil" . Communications of the ACM . 12 (9). Nueva York, NY, EE. UU.: ACM: 507–510 . doi : 10.1145/363219.363226 . S2CID 8164996 .
- ↑ Waite, William M. (julio de 1970). "El sistema de programación móvil: STAGE2". Communications of the ACM . 13 (7). Nueva York, NY, EE. UU.: ACM: 415–421 . doi : 10.1145/362686.362691 . S2CID 11733598 .
- ↑ "Universidad del Norte de Florida" (PDF) . Archivado del original (PDF) el 29 de agosto de 2017. Consultado el 15 de agosto de 2018 .
- ↑ "DTF (DOS/VSE)" . IBM .
- ↑ "Centro de conocimiento de IBM" . Centro de conocimiento de IBM . 16 de agosto de 2013.
- 1 2 "Instrucciones macro en lenguaje ensamblador" . Cisco .
- ↑ PROGRAMA DE ENSAMBLAJE FORTRAN (FAP) para IBM 709/7090 (PDF) . Boletín del sistema de procesamiento de datos 709/7090. IBM . 1961. J28-6098-1.
- ↑ Sistemas de programación IBM 7090/7094: - Lenguaje de programación en lenguaje ensamblador macro (MAP) (PDF) . Biblioteca de referencia de sistemas. 1964. C28-6311-4 . Consultado el 12 de enero de 2025 .
- ↑ Manual de referencia - Sistemas de programación de la serie IBM 7070 - Autocoder (PDF) . Biblioteca de referencia de sistemas IBM (Primera edición). IBM Corporation . 1961. C28-6121-0.
- 1 2 Holbrook, Bernard D.; Brown, W. Stanley. "Informe técnico de ciencias de la computación n.° 99: una historia de la investigación en computación en los Laboratorios Bell (1937-1975)" . Laboratorios Bell . Recuperado el 2 de febrero de 2020 .
{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - ↑ "Macro SAP – Modificación del compilador de macros de SAP" . HOPL: Enciclopedia histórica en línea de lenguajes de programación . Archivado del original el 13 de agosto de 2008.
- ↑ Layzell, P. (1985). "La historia de los macroprocesadores en la extensibilidad de los lenguajes de programación" . The Computer Journal . 28 (1): 29– 33. doi : 10.1093/comjnl/28.1.29 .
- ↑ "paquete syscall - syscall - Paquetes Go" . pkg.go.dev . Consultado el 6 de junio de 2024 .
Enlaces externos
- Cómo escribir instrucciones de macro
- Presentación de PowerPoint de los profesores del Instituto Tecnológico de Rochester, archivada el 15 de junio de 2022 en Wayback Machine.
- Estructuras de programación
- Código fuente
- Software de automatización