Почему программистам «настоятельно рекомендуется не участвовать в преобразованиях синтаксического анализа»?

#erlang #parse-transform

#эрланг #синтаксический анализ-преобразование

Вопрос:

Согласно документации erl_id_trans:

Программистам настоятельно рекомендуется не участвовать в преобразованиях синтаксического анализа, и при возникновении проблем поддержка не предоставляется.

Почему программистам настоятельно рекомендуется не использовать parse_transform/2? Будет ли это не поддерживаться в будущем? Кроме parse_transform/2, существует ли механизм для ввода кода (модификация байт-кода во время выполнения) или изменения исходного кода до его компиляции?

Ответ №1:

Одна из причин, которую я могу себе представить, заключается в том, что они не хотят исправлять формат синтаксического дерева.

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

Добавление: в комментариях возник вопрос о других способах манипулирования исходным кодом Erlang или байтовым кодом

  • Для полуавтоматического рефакторинга кода есть Wrangler
  • У вас есть доступ к препроцессору Erlang, токенизатору и анализатору, например, к синтаксическим деревьям вашей программы
  • Для простого и переносимого манипулирования абстрактными формами (то, что вы получаете из синтаксического анализатора или даже beam-файлов) есть syntax_tools
  • Для работы с файлами beam используется beam_lib

Комментарии:

1. О, хорошо, значит, речь шла о совместимости. Спасибо за ответ. Вы случайно не знаете каких-либо других способов манипулирования исходным / байтовым кодом? Я все еще изучаю это, но, насколько я могу судить, parse_transform, похоже, подходит, если кто-то хочет добавить функциональность в уже существующий код Erlang.

2. ИМХО: если преобразования синтаксического анализа просто подходят для вашей проблемы, и вы уверены, что нет хорошего способа без синтаксического анализа, чтобы сделать это, просто продолжайте и используйте его.

3. Я бы сказал, что основная проблема заключается в том, что абстрактный синтаксис erlang нетривиален, и легко генерировать незаконный код. Одна из проблем с их использованием заключается в том, что вы НЕ МОЖЕТЕ создать новый синтаксис, поскольку преобразования синтаксического анализа применяются после синтаксического анализа.

4. Спасибо вам обоим за ваши отзывы. @rvirding, невозможность создать новый синтаксис с помощью преобразования синтаксического анализа, похоже, не является проблемой … скорее, это не то, для чего они предназначены. Да, мне нужно более подробно рассмотреть beam_lib… но необходимость компиляции с debug_info уже немного уродлива. Я рассматриваю доступные варианты добавления некоторых базовых операций АОП. Похоже, что методы, упомянутые Peer, почти полностью охватывают их, поэтому я принимаю этот ответ. Приветствия.

5. @rvirding: да, жаль (и, вероятно, благословение), что нельзя создать новый синтаксис. В синтаксисе Erlang нет полноценных макросов Lisp, но тогда есть LFE, есть ли у него макросы?