** Я перешел со среднего уровня. Новый адрес: 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, все это приветствуется!