** Я перешел со среднего уровня. Новый адрес: kodare.net **

Вы генерируете код для языка, на котором пишете? Тогда язык, который вы используете, ужасен. По определению он недостаточно эффективен, потому что вам нужно писать код для написания кода, а не просто выражать то, что вам нужно напрямую.

Тем не менее, есть место для написания собственных генераторов кода. Прямо сейчас я пишу генератор кода для Elm на основе инструмента Cog Неда Батчелдера. Основная причина, по которой я хотел это сделать, заключается в том, что Elm - недостаточно мощный язык. Некоторые из них являются преднамеренными особенностями (полное отсутствие побочных эффектов), другие являются следствием молодости языка, а третьи связаны с тем, что основная команда еще не заботится о некоторых проблемах в достаточной степени, чтобы расставить приоритеты и / или нет известного хорошего решения.

Я бы предпочел, чтобы Элм был более выразительным, но когда я начал думать о своей ситуации, я понял, что есть некоторые интересные положительные побочные эффекты при написании генератора кода для Элма. Но обо всем по порядку:

Как у Вяза недостаточно силового питания?

Основная проблема в том, что мы, пользователи Elm, не имеем доступа к той же информации, что и компилятор:

  • Невозможно изменить абстрактное синтаксическое дерево во время компиляции (например, макросы Lisp).
  • Невозможно выполнить какое-либо отражение ни во время компиляции, ни во время выполнения.
  • Конструкции самого языка очень ограничены, поэтому их нельзя использовать для решения проблем, и вы быстро достигнете пределов.
  • Сам компилятор не построен как API (например, в Python парсер от источника до AST и генератор от AST до байт-кода доступны в стандартной библиотеке).

Это создает сильный стимул для генерации кода, и довольно много пользователей Elm признаются в создании кода при обсуждении на Reddit.

Почему вяз?

Таким образом, вы можете сделать вывод, что я считаю Elm не очень хорошим языком, поскольку он требует генерации кода, и вы были правы. Но я все еще выступаю за Elm, а не за ClojureScript, отчасти из-за ограничений Elm. Это гораздо меньший язык и гораздо более строгий, поэтому вы можете знать, что многие гарантии выполняются во всем коде Elm. В ClojureScript дело обстоит иначе, и к лучшему, и к худшему. Еще одна особенность Elm в том, что то, что он делает, делает очень хорошо. Он может сделать это с такой небольшой командой, потому что он безумно сфокусирован. Я хочу этим воспользоваться.

Я утверждаю, что если мы будем использовать Elm, у нас должна быть хорошая система генерации кода с первого дня. Я делаю ставку на Cog по трем причинам:

  • Он основан на Python, который является нашим серверным языком, на котором мы проводим большую часть времени. Вы хотите, чтобы генератор было легко понять и модифицировать.
  • Cog - единственный из известных мне инструментов генерации кода, который генерирует на месте. Некоторым это может показаться неприятным, но самое интересное в том, что вы можете добавить генерацию кода именно туда, где вам это нужно, вместо того, чтобы создавать совершенно новые файлы. Это также означает, что у вас нет больших фрагментов кода, которые существуют дважды (один раз в шаблоне и один раз в сгенерированном файле), что должно снизить риск редактирования неправильного файла.
  • Поскольку и наш внутренний язык, и Cog - это Python, если мы хотим связать наш внутренний код с кодом внешнего интерфейса, легко сгенерировать фрагменты кода Elm и структур данных непосредственно из нашего существующего кода, убедившись, что они всегда синхронизированы. . Это крутой побочный эффект от принудительного включения в генераторы кода. Это может стать сильной стороной системы в целом, даже если это слабость одной из ее частей.

Представляем вяз-шестеренку

Я хочу начать обсуждение инструментов генерации кода для Elm, и я делаю это, создавая инструмент и открывая его исходный код. Я думаю, что наличие инструментов с открытым исходным кодом поможет во многих отношениях:

  • Избегайте дублирования усилий.
  • Сначала представьте функции в генераторах кода, которые можно рассматривать как доказательство концепций собственно Elm.
  • Помогаем людям писать больше СУХОГО кода.
  • Надеюсь, люди не станут отрицать, что генерация кода в Elm - это то, что нам нужно, по крайней мере, как временное решение: P
  • С помощью elm-Cog я специально помогаю людям с базами кода Python (или тем, кто может взаимодействовать с Python) беспрепятственно взаимодействовать с их внешним интерфейсом Elm, но этот инструмент должен быть удобным и приятным для пользователей других языков внутреннего интерфейса.

Голы вяз-винтик

  • Вывести сгенерированный код, который может проходить через elm-формат без изменений.
  • Небольшие составные функции, которые можно повторно использовать для создания более сложных функций.
  • Реализуйте две недостающие функции, которые я уже нашел, и которые мне нужны.
  • Открытая организация: если вы отправите хороший запрос на включение функций или тестов, я сразу дам вам права на фиксацию. Это фантастически сработало для меня с instar.

Возможности на данный момент

  • Выводить записи, списки и типы объединений. Само по себе это не так уж и полезно, если только ваша серверная часть не является Python или если вы используете Cog для генерации Elm и другого языка, но это хорошая основа для построения других вещей.
  • Enums. Перечисление - это тривиальный случай типа объединения (тип Foo = A | B) с сгенерированным сопроводительным списком (foo_list = [A, B]).
  • Расширенные перечисления. Перечисление с дополнительной связанной записью для каждого случая. Полезно для хранения дополнительных данных, таких как отображаемое имя, сериализованное имя и т. Д.

Пример

Вот пример сгенерированного перечисления. Сначала вы пишете это:

--- [[[cog enum('Baz', 'D, E, F') ]]]
--- [[[end]]]

Затем после запуска elm-cog в исходном коде вы получите:

-- [[[cog enum('Baz', 'D, E, F') ]]]


type Baz
    = D
    | E
    | F


baz_list =
    [ D, E, F ]



-- [[[end]]]

Никогда не бойтесь, что ваш список и ваше перечисление снова не синхронизированы!

Присоединяйся ко мне!

Заходи на гитхаб и помогай! Запросы функций, ошибки, запросы на включение, истории о болевых точках, которые у вас были в Elm, которые могут быть решены с помощью elm-cog, все это приветствуется!