2012-03-28 8 views
11

bei einer inoffiziellen OCaml Grammatik Blick in this site die einzige Produktion, wo begin erscheint, ist:ist begin..end in OCaml syntaktischer Zucker?

Expression ::= begin Expression end 

und ein wenig weiter unten sieht man:

Expression ::= ( Expression [:Type] ) 

Das, zusammen mit einigen offhand Ersatz von begin/end mit (/) in irgendeinem trivialen Code (der die Korrektheit nicht beeinflußte) scheint das Schlüsselwort beginend vorzuschlagen s sind nur syntaktischer Zucker. Oder fehlt mir etwas?

Antwort

27

"Syntactic Zucker" schlägt eine einfache, aber nicht triviale Übersetzung zu anderen Konstrukten vor. begin .. end ist nicht syntaktischer Zucker, es ist überflüssig mit (..), denn es tut genau die gleiche Sache.

Wenn Sie interessiert sind, war die Absicht, dass Programmierer begin .. end kann einen dringend notwendigen Ausdruck einzuschließen, die für ihre Nebenwirkungen durchgeführt und (..) für einen Ausdruck mit einem Nicht-Einheitswert. Aber der Compiler erzwingt das nicht, die Designer der Sprache dachten einfach, es würde schöner aussehen, wenn sie auf diese Weise benutzt würden, das ist alles.

+3

Wer sagt, dass syntaktischer Zucker nicht-trivial sein muss? Was heißt das überhaupt? Ich würde zweifellos Anfang als syntaktischen Zucker einstufen. –

+5

@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. ** –

+0

@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. –

9

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.

+1

Pedantisch bedeutet präzise, ​​mit einer starken Konnotation von _overly precise_. Ihre Antwort war IMO präzise. –

Verwandte Themen