OCaml "с" охранником в сопоставлении с образцом

Я прочитал о шаблонных охранниках на code.google.com, где показан этот тип охранников:

match x with
| pat with g = y -> z
| ...
| pat with g = y -> z

В OCaml 4.02 однако, похоже, не работает (Syntax error: pattern expected.), поэтому возникает вопрос: существует ли обходной путь для достижения такого рода привязки при сопоставлении с образцом? Я хотел бы написать что-то подобное

match something with
| value with y = f x when y > 0 -> value + y

Заранее спасибо, ура.

2 ответа

Решение

Это OCaml "шаблоны" расширение синтаксиса CamlP4. Сам по себе OCaml не имеет шаблонных средств защиты, и это расширение p4 предоставило его в качестве расширений синтаксиса, которые должны отлаживаться препроцессором CamlP4 перед передачей в компилятор OCaml.

К сожалению, "шаблоны" не были перенесены в OCaml 4. Я не знаю точно, почему, но, вероятно, из-за высокой стоимости переноса при изменении внутренних представлений OCaml. CamlP4 очень мощный, но его синтаксические расширения сложно писать и поддерживать. На самом деле сообщество OCaml сейчас переходит на PPX, еще одну среду препроцессора. PPX не может изменить сам синтаксис OCaml, но там все намного проще.

Недавно я написал расширение PPX для шаблонных охранников, которое работает с 4.02.1: https://bitbucket.org/camlspotter/ppx_pattern_guard. Ваш пример может быть переведен на:

match something with
| value when [%guard let y = f x;; y > 0] -> value + y

Это выглядит ужаснее, чем "шаблоны", но в PPX мы должны быть в пределах ванильного синтаксиса с некоторыми атрибутами и расширениями, такими как [%guard ...],

Эта страница о ocaml-patterns функция, которая никогда не была объединена с компилятором. В настоящее время у OCaml нет активных шаблонов.

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