Это начало... в синтаксическом сахаре OCaml?

Глядя на неофициальную грамматику OCaml в этом сайте, единственное, где появляется begin:

Expression ::= begin Expression end

и немного дальше вниз:

Expression ::= (   Expression  [:Type]   )

То, что вместе с некоторыми отменными заменами begin/end с помощью (/) в некотором тривиальном коде (который не повлиял на правильность), может показаться, что begin end ключевые слова - это просто синтаксический сахар. Или я что-то упускаю?

Ответ 1

"Синтаксический сахар" предлагает простой, но не тривиальный перевод на другие конструкции. begin .. end не является синтаксическим сахаром, он избыточным с ( .. ), потому что он выполняет точно то же самое.

Если вы заинтересованы, было намерено, что программисты могут использовать begin .. end, чтобы заключить императивное выражение, выполняемое для его побочных эффектов, и ( .. ) для выражения с не-единицей. Но компилятор не гарантирует, что разработчики языка просто думали, что это будет выглядеть лучше, если бы они были использованы таким образом, что все.

Ответ 2

Фактически, существует несколько видов использования скобок в грамматике OCaml для разных грамматических правил, и не все из них могут использоваться с begin..end. Parenthesis и begin..end могут использоваться как разделители выражений без семантики для целей устранения неоднозначности (как вы сказали, expr ::= '(' expr ')'). () также представляет константу типа unit и, как каламбур, begin end также разрешен там, но этот последний не указан в руководстве, только последовательно поддерживаемый реализацией.

Но круглые скобки также можно использовать

  • чтобы разграничить шаблоны: function (_::_)::_ -> ...
  • в качестве синтаксического сахара для Array.get и Array.set: t.(i) t.(i) <- e
  • для аннотаций типа (e : t) как в выражениях, так и в шаблонах (это не является особым случаем разборчивых разделителей, поскольку он недействителен без скобок)
  • для подтипов: (e :> t) и (e : s :> t)
  • чтобы сформировать маркированные образцы: fun ~(x:int) .. и fun ?(x=10) ..
  • в различных связанных местах (принуждения, аннотации и т.д.) в модулях, сигнатурах и классах/объектах частей синтаксиса

Ни одно из этого использования не может начаться... вместо этого используется, поэтому было бы нецелесообразно заменять ( на begin и ) на end систематически (в то время как обратное верно).

Извините за педантичный ответ, но сам вопрос был довольно точным. Я не уверен, начнется... обработка - самая элегантная часть грамматики OCaml (у которой много бородавок). Можно было бы пожелать, чтобы они действительно были эквивалентными, но тогда нет смысла настаивать на написании begin x : int end вместо (x : int).