Подтвердить что ты не робот

Как программисты Clojure используют макросы?

Мое понимание Clojure homoiconicity существует, чтобы упростить создание макросов.

Основываясь на qaru.site/info/216494/..., похоже, что макросы используются экономно, за исключением DSL, в которых функции более высокого порядка не используются.

Может ли кто-нибудь поделиться некоторыми примерами того, как макросы используются в реальной жизни?

4b9b3361

Ответ 1

Правильно, что homoiconicity упрощает запись макросов Clojure. В основном они позволяют вам писать код, который строит любой код, который вы хотите, используя философию "code is data" Lisp.

Макросы в гомокиноязычном языке также чрезвычайно эффективны. Там была интересная презентация примера, в которой они реализовали LINQ-подобный синтаксис запроса всего в трех строках Clojure.

В общем случае макросы Clojure потенциально полезны по многим причинам:

  • Структуры управления - возможно создание определенных структур управления с использованием макросов, которые никогда не могут быть представлены как функции. Например, вы не можете написать if как функцию, потому что если бы это была функция, тогда она должна была бы оценить все три аргумента, тогда как с макросом вы можете сделать это только для оценки двух (значение условия и либо true или ложное выражение)

  • Оптимизация времени компиляции - иногда вы хотите оптимизировать свой код на основе константы, которая известна или может быть вычислена во время компиляции. Например, вы можете создать функцию "logging", которая регистрируется только в том случае, если код был скомпилирован в режиме отладки, но создает нулевые служебные данные в производственном приложении.

  • Генерация кода/исправление шаблона - если вам нужно создать очень похожий код с аналогичной структурой, вы можете использовать макросы, чтобы автоматически генерировать их из нескольких параметров. Если вы ненавидите шаблон, то макросы - ваши друзья.

  • Создание нового синтаксиса - если вы увидите необходимость в определенном фрагменте синтаксиса, который был бы полезен (возможно, инкапсулируя общий шаблон), вы можете создать макрос для его реализации. Некоторые DSL, например, могут быть упрощены с помощью дополнительного синтаксиса.

  • Создание нового языка с совершенно новой семантикой (Credits для SK-Logic!) теоретически вы даже можете зайти так далеко, чтобы создать новый язык с использованием макросов, который эффективно скомпилировал бы ваш новый язык вниз в Clojure. Новый langauge даже не должен быть Lisp -like: он мог бы анализировать и компилировать произвольные строки, например.

Один важный совет - использовать макросы только в том случае, если они вам нужны, а функции не будут работать. Большинство проблем можно решить с помощью функций. Помимо того факта, что макросы являются излишними для простых случаев, функции обладают некоторыми внутренними преимуществами: они более гибкие, могут храниться в структурах данных, могут передаваться как параметры для функций более высокого порядка, немного легче понять людям и т.д.