Clojure - Macros

Em qualquer idioma, Macrossão usados ​​para gerar código embutido. Clojure não é exceção e fornece recursos de macro simples para desenvolvedores. As macros são usadas para escrever rotinas de geração de código, que fornecem ao desenvolvedor uma maneira poderosa de adaptar a linguagem às necessidades do desenvolvedor.

A seguir estão os métodos disponíveis para macros.

defmacro

Esta função é usada para definir sua macro. A macro terá um nome de macro, uma lista de parâmetros e o corpo da macro.

Sintaxe

A seguir está a sintaxe.

(defmacro name [params*] body)

Parameters- 'nome' é o nome da macro. 'params' são os parâmetros atribuídos à macro. 'corpo' é o corpo da macro.

Return Value - Nenhum.

Exemplo

Um exemplo de como isso é usado é mostrado no programa a seguir.

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

Resultado

O programa acima produz a seguinte saída.

Hello

No programa acima, você pode ver que a macro 'Simples' é expandida em linha para 'println' “Olá”. Macros são semelhantes a funções, com a única diferença de que os argumentos para um formulário são avaliados no caso de macros.

macro-expansão

Isso é usado para expandir uma macro e colocar o código embutido no programa.

Sintaxe

A seguir está a sintaxe.

(macroexpand macroname)

Parameters - 'macroname' é o nome da macro que precisa ser expandida.

Return Value - A macro expandida.

Exemplo

Um exemplo de como isso é usado é mostrado no programa a seguir.

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

Resultado

O programa acima produz a seguinte saída.

Hello

Macro com Argumentos

As macros também podem ser usadas para aceitar argumentos. A macro pode receber qualquer número de argumentos. O exemplo a seguir mostra como os argumentos podem ser usados.

Exemplo

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

O exemplo acima coloca um argumento na macro Simples e usa o argumento para adicionar o valor do argumento a uma lista.

Resultado

O programa acima produz a seguinte saída.

(2 2)