Clojure - Macros
En cualquier idioma, Macrosse utilizan para generar código en línea. Clojure no es una excepción y proporciona facilidades de macro simples para desarrolladores. Las macros se utilizan para escribir rutinas de generación de código, que proporcionan al desarrollador una forma poderosa de adaptar el lenguaje a las necesidades del desarrollador.
A continuación se muestran los métodos disponibles para macros.
defmacro
Esta función se utiliza para definir su macro. La macro tendrá un nombre de macro, una lista de parámetros y el cuerpo de la macro.
Sintaxis
A continuación se muestra la sintaxis.
(defmacro name [params*] body)
Parameters- 'nombre' es el nombre de la macro. 'params' son los parámetros asignados a la macro. 'cuerpo' es el cuerpo de la macro.
Return Value - Ninguno.
Ejemplo
En el siguiente programa se muestra un ejemplo de cómo se usa.
(ns clojure.examples.example
(:gen-class))
(defn Example []
(defmacro Simple []
(println "Hello"))
(macroexpand '(Simple)))
(Example)
Salida
El programa anterior produce la siguiente salida.
Hello
En el programa anterior, puede ver que la macro 'Simple' se expande en línea a 'println' "Hola". Las macros son similares a las funciones, con la única diferencia de que los argumentos de un formulario se evalúan en el caso de las macros.
macro-expandir
Esto se usa para expandir una macro y colocar el código en línea en el programa.
Sintaxis
A continuación se muestra la sintaxis.
(macroexpand macroname)
Parameters - 'macroname' es el nombre de la macro que debe expandirse.
Return Value - La macro expandida.
Ejemplo
En el siguiente programa se muestra un ejemplo de cómo se usa.
(ns clojure.examples.example
(:gen-class))
(defn Example []
(defmacro Simple []
(println "Hello"))
(macroexpand '(Simple)))
(Example)
Salida
El programa anterior produce la siguiente salida.
Hello
Macro con argumentos
Las macros también se pueden utilizar para incorporar argumentos. La macro puede aceptar cualquier número de argumentos. El siguiente ejemplo muestra cómo se pueden usar los argumentos.
Ejemplo
(ns clojure.examples.example
(:gen-class))
(defn Example []
(defmacro Simple [arg]
(list 2 arg))
(println (macroexpand '(Simple 2))))
(Example)
El ejemplo anterior coloca un argumento en la macro Simple y luego usa el argumento para agregar un valor de argumento a una lista.
Salida
El programa anterior produce la siguiente salida.
(2 2)