Учебники

Clojure — Макросы

На любом языке макросы используются для генерации встроенного кода. Clojure не является исключением и предоставляет простые средства макросов для разработчиков. Макросы используются для написания процедур генерации кода, которые предоставляют разработчику мощный способ адаптировать язык к потребностям разработчика.

Ниже приведены методы, доступные для макросов.

defmacro

Эта функция используется для определения вашего макроса. Макрос будет иметь имя макроса, список параметров и тело макроса.

Синтаксис

Ниже приводится синтаксис.

(defmacro name [params*] body)

Параметры — ‘name’ — это имя макроса. «params» — это параметры, назначенные макросу. «тело» — это тело макроса.

Возвращаемое значение — Нет.

пример

Пример того, как это используется, показан в следующей программе.

Live Demo

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

Выход

Вышеуказанная программа производит следующий вывод.

Hello

Из вышеприведенной программы вы можете видеть, что макрос «Simple» встроен в «println» «Hello». Макросы похожи на функции, с той лишь разницей, что аргументы формы оцениваются в случае макросов.

макро-расширение

Это используется для расширения макроса и размещения встроенного кода в программе.

Синтаксис

Ниже приводится синтаксис.

(macroexpand macroname)

Параметры — «macroname» — это имя макроса, который необходимо расширить.

Возвращаемое значение — расширенный макрос.

пример

Пример того, как это используется, показан в следующей программе.

Live Demo

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

Выход

Вышеуказанная программа производит следующий вывод.

Hello

Макрос с аргументами

Макросы также можно использовать для аргументов. Макрос может принимать любое количество аргументов. В следующем примере показано, как можно использовать аргументы.

пример

Live Demo

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

Приведенный выше пример помещает аргумент в макрос Simple и затем использует аргумент для добавления значения аргумента в список.

Выход

Вышеуказанная программа производит следующий вывод.