In der Tat gibt es mehrere Verwendungen von Klammern in der OCaml-Grammatik für verschiedene Grammatikregeln, und nicht alle von ihnen können mit begin..end verwendet werden. Parenthesis und begin..end können als Semantik-freie Ausdruckbegrenzer für Disambiguierungszwecke verwendet werden (wie Sie gesagt haben, expr ::= '(' expr ')'
). ()
stellt auch die Konstante vom Typ unit
dar, und als Wortspiel ist auch begin end
dort erlaubt - aber letzteres ist im Handbuch nicht angegeben, nur konsequent von der Implementierung unterstützt.
Aber Klammern können auch
- Muster verwendet werden, um abgrenzen:
function (_::_)::_ -> ...
- als syntaktischer Zucker für
Array.get
und Array.set
: t.(i)
t.(i) <- e
- für Typenannotationen
(e : t)
sowohl in Ausdrücken und Mustern (dies ist nicht ein Sonderfall der disambiguierenden Trennzeichen, weil es ohne Klammern nicht gültig ist)
- für Subtypisierung Zwänge:
(e :> t)
und (e : s :> t)
- markierte Muster-Verbindungen zu bilden: und
fun ~(x:int) ..
fun ?(x=10) ..
- in verschiedenen verwandten Orten (Zwänge, Anmerkungen, usw.) in dem Modul, die Unterschrift und Klasse/Objekte Teile der Syntax
Für keine dieser Anwendung kann stattdessen verwendet begin..end, so wäre es auf jeden Fall keine Gültigkeit (
mit begin
und )
mit end
systematisch zu ersetzen (während das gegenteil ist richtig).
Sorry für die pedantische Antwort, aber die Frage war selbst ziemlich genau. Ich bin mir nicht sicher, beginne ..Die Endbehandlung ist der eleganteste Teil der OCaml-Grammatik (mit vielen Warzen). Man könnte sich wünschen, dass sie wirklich gleichwertig wären, aber dann ist es wenig sinnvoll, darauf zu bestehen, begin x : int end
anstelle von (x : int)
zu schreiben.
Wer sagt, dass syntaktischer Zucker nicht-trivial sein muss? Was heißt das überhaupt? Ich würde zweifellos Anfang als syntaktischen Zucker einstufen. –
@AndreasRossberg Wenn der OCaml-Compiler 'begin .. end' zu' (..) 'intern übersetzt, wäre ersterer syntaktischer Zucker. Der Compiler macht das in keinem sinnvollen Sinn. Stattdessen werden beide Konstrukte implizit in der Konstruktion des AST kodiert. ** Die eine ist nicht in die andere übersetzt. ** –
@AndreasRossberg Ich weiß über kulturelle Unterschiede und all das, aber ich finde Ihre Kommentare etwas unproduktiv. Da Sie kommentieren, nicht einverstanden zu sein, könnten Sie versuchen, Ihren Standpunkt ein wenig besser zu erklären als zum Beispiel: "Warum sagen Sie, dass Sie in Ocaml keinen eigenen Code kompilieren können? Natürlich kannst du."? Ich sollte Ihnen in diesem besonderen Fall nicht sagen, dass Sie dem bereits gegebenen Link folgen oder das, was dort gesagt wird, wiederholen sollten. –