Это начало... в синтаксическом сахаре 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)
.