Вопросы об использовании или разработке PPX (расширение синтаксиса OCaml)

Расширения синтаксиса PPX

ppx — это формат расширения синтаксиса, поддерживаемый в настоящее время OCaml. Рерайтеры PPX — это препроцессоры для программ OCaml, которые применяются к коду перед передачей его компилятору. Они работают с AST, полученным в результате его синтаксического анализа, и вычисляют новый AST, который будет фактически скомпилирован.

Узлы расширения

В OCaml есть расширения синтаксиса, предназначенные для использования внешними инструментами. Существуют виды расширений, которые являются атрибутами и узлами расширения .

  1. Атрибуты — это «украшения» синтаксического дерева, которые чаще всего игнорируются средством проверки типов, но могут использоваться внешними инструментами.
  2. Узлы расширения — это общие заполнители в синтаксическом дереве. Они отклоняются средством проверки типов и предназначены для «расширения» внешними инструментами, такими как средства перезаписи -ppx.

Опция

ocamlc и ocamlopt используют параметр командной строки. Эта опция принимает в качестве аргумента программу, которая выполняется во время компиляции файла, чтобы преобразовать его на лету. Эта программа называется переписчиком ppx. Точнее, после того, как компилятор OCaml проанализировал исходный файл и создал соответствующий AST, он запускает ppx с этим AST в качестве входных данных. ppx возвращает новый преобразованный AST, и компилятор продолжает процесс компиляции с этим новым AST, отбрасывая исходный.

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

Использование дюны

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

      (preprocess (pps ppx1 -foo ppx2 -- -bar 42))

ppxlib

Современное решение для написания расширений PPX. Без этой библиотеки написание расширений PPX будет ненадежным и прервется при изменении версии OCaml. ppxlib объединяет несколько старых проектов, чтобы обеспечить полную платформу для написания эффективных и устойчивых расширений PPX.

OCaml-миграция-parsetree

Эта библиотека преобразует деревья синтаксического анализа OCaml между различными основными версиями, таким образом делая PPX, написанный для данной версии OCaml, переносимым со старыми версиями.