Clojure - Macro

In qualsiasi lingua, Macrosvengono utilizzati per generare codice in linea. Clojure non fa eccezione e fornisce semplici funzionalità macro per gli sviluppatori. Le macro vengono utilizzate per scrivere routine di generazione del codice, che forniscono allo sviluppatore un modo potente per adattare il linguaggio alle esigenze dello sviluppatore.

Di seguito sono riportati i metodi disponibili per le macro.

defmacro

Questa funzione viene utilizzata per definire la macro. La macro avrà un nome macro, un elenco di parametri e il corpo della macro.

Sintassi

Di seguito è riportata la sintassi.

(defmacro name [params*] body)

Parameters- "nome" è il nome della macro. 'params' sono i parametri assegnati alla macro. "body" è il corpo della macro.

Return Value - Nessuno.

Esempio

Un esempio di come viene utilizzato è mostrato nel seguente programma.

(ns clojure.examples.example
   (:gen-class))
(defn Example []
   (defmacro Simple []
      (println "Hello"))
   (macroexpand '(Simple)))
(Example)

Produzione

Il programma precedente produce il seguente output.

Hello

Dal programma sopra puoi vedere che la macro 'Simple' è espansa inline a 'println' “Hello”. Le macro sono simili alle funzioni, con la sola differenza che gli argomenti di un modulo vengono valutati nel caso delle macro.

macro-espandere

Viene utilizzato per espandere una macro e inserire il codice inline nel programma.

Sintassi

Di seguito è riportata la sintassi.

(macroexpand macroname)

Parameters - "macroname" è il nome della macro che deve essere espansa.

Return Value - La macro espansa.

Esempio

Un esempio di come viene utilizzato è mostrato nel seguente programma.

(ns clojure.examples.example
   (:gen-class))
(defn Example []
   (defmacro Simple []
      (println "Hello"))
   (macroexpand '(Simple)))
(Example)

Produzione

Il programma precedente produce il seguente output.

Hello

Macro con argomenti

Le macro possono essere utilizzate anche per accettare argomenti. La macro può contenere un numero qualsiasi di argomenti. L'esempio seguente mostra come utilizzare gli argomenti.

Esempio

(ns clojure.examples.example
   (:gen-class))
(defn Example []
   (defmacro Simple [arg]
      (list 2 arg))
   (println (macroexpand '(Simple 2))))
(Example)

L'esempio precedente inserisce un argomento nella macro Semplice e quindi utilizza l'argomento per aggiungere il valore dell'argomento a un elenco.

Produzione

Il programma precedente produce il seguente output.

(2 2)