Что такое PPX?

Во многих проектах, использующих ReasonML, часто используется аббревиатура PPX, но редко объясняется.

Что такое PPX?

Зачем они нужны ReasonML?

2 ответа

Решение

PPX (расширение препроцессора) - это средство перезаписи абстрактного синтаксического дерева (AST). По сути, просто функцияast => ast.

AST - это представление синтаксиса, древовидной структуры данных, полученной в результате анализа исходного кода. Поскольку PPX может принимать и возвращать только этот AST, он ограничен существующим синтаксисом OCaml/ReasonML. Однако он может переосмыслить синтаксис и может встроить совершенно другой синтаксис в строку, обеспечивая ограниченную и инкапсулированную форму расширения синтаксиса.

PPX также не могут перезаписывать весь AST. Они ограничены узлами, которые были помечены пользователем с помощью любого из атрибутов ([@...)), которые связаны с существующими узлами или узлами расширения ([%...]), которые являются автономными узлами AST. PPX зарегистрирует одну или несколько ловушек, которые получат связанный с ними AST, когда они обнаруживаются компилятором, и сможет преобразовать эти части AST до того, как компилятор перейдет на свою фазу.

Примеры

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

[@deriving show]
type t = {
  foo: int,
  bar: string,
};

создаст show функция (а также некоторые другие), которая при задании значения типа t вернет красиво напечатанное строковое представление.

ppx_bx_css а также styled-ppx Оба являются PPX, которые анализируют CSS в некоторую структуру данных OCaml/ReasonML для использования с различными библиотеками CSS-in-JS. Они встраивают синтаксис CSS в строку в кавычках, которая, по крайней мере, для этой цели, представляет собой обычную строку, которая допускает разрывы строк и не требует экранирования" а также \.

  [%style
    {|
      color: red;
      margin: auto 0 10px 1em;
      width: 70%;
      background: url(http://example.com/test.jpg)
    |}
  ];

PPX происходит из экосистемы Ocaml, частью которой является ReasonML. По сути, PPX предоставляет вам API для расширения синтаксиса языка.

Посетите http://ocamllabs.io/doc/ppx.html

спасибо за ефоз

Другие вопросы по тегам