Spec-Zone.ru › OCaml 5.0

12.16 Синтаксис, используемый только для расширений

  • 12.16.1 Операторы расширений
  • 12.16.2 Литералы расширений

(Введено в OCaml 4.02.2, расширено в 4.03)

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

12.16.1 Операторы расширений

(Введено в OCaml 4.02.2, расширено для унарных операторов в OCaml 4.12.0)

infix-symbol ::= ...
∣ # { operator-char } # { operator-char ∣ # }
prefix-symbol ::= ...
∣ (? ∣ ~ ∣ !) { operator-char } # { operator-char ∣ # }

Для расширений доступны два класса операторов: инфиксные операторы с именем, начинающимся с символа #, содержащие более одного символа #, и унарные операторы с именем (начинающимся с символа ?, ~ или !), содержащие как минимум один символ #.

Например:

# let infix x y = x##y;;

Error: '##' is not a valid value identifier.
# let prefix x = !#x;;

Error: '!#' is not a valid value identifier.

Обратите внимание, что оба ## и !# должны быть удалены переписывателем ppx, чтобы этот пример был корректным.

12.16.2 Литералы расширений

(Введено в OCaml 4.03)

float-literal ::= ...
∣ [-] (0…9) { 0…9 ∣ _ } [. { 0…9 ∣ _ }] [(e ∣ E) [+ ∣ -] (0…9) { 0…9 ∣ _ }] [g…z ∣ G…Z]
∣ [-] (0x ∣ 0X) (0…9 ∣ A…F ∣ a…f) { 0…9 ∣ A…F ∣ a…f ∣ _ } [. { 0…9 ∣ A…F ∣ a…f ∣ _ }] [(p ∣ P) [+ ∣ -] (0…9) { 0…9 ∣ _ }] [g…z ∣ G…Z]
int-literal ::= ...

Целочисленные и плавающие литералы, за которыми следует однобуквенный идентификатор в диапазоне [g..z∣G..Z], являются литералами, используемыми только для расширений.

© 1995-2022 INRIA.
https://v2.ocaml.org/releases/5.0/htmlman/extensionsyntax.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API