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)