такое начало .. конец в синтаксическом сахаре OCaml? - PullRequest
11 голосов
/ 28 марта 2012

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

Expression ::= begin Expression end

и чуть дальше видно:

Expression ::= (   Expression  [:Type]   )

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

Ответы [ 2 ]

28 голосов
/ 28 марта 2012

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

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

10 голосов
/ 30 марта 2012

На самом деле в грамматике OCaml есть несколько вариантов использования скобок для различных грамматических правил, и не все из них можно использовать с begin..end. Круглые скобки и 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).

...