bemerkte ich, dass der folgende Code kompiliert und arbeitet in VS 2013:Warum ist "do" in einer Funktion erlaubt?
let f() =
do Console.WriteLine(41)
42
Aber wenn bei der F # 3.0-Spezifikation suchen kann ich keine Erwähnung von do
finden auf diese Weise verwendet wird. Soweit ich das beurteilen kann, do
folgende Verwendungen haben:
- Als Teil der Schleife (z
while expr do expr done
), das ist hier nicht der Fall. Innerhalb Berechnung Ausdrücke, z.B .:
seq { for i in 1..2 do do Console.WriteLine(i) yield i * 2 }
dass hier entweder nicht der Fall ist,
f
keine Rechenausdrücke enthält.Obwohl was verwirrt mich hier ist, dass nach der Spezifikation sollte
do
vonin
folgen. Die Optionin
sollte aufgrund der Lightweight-Syntax optional sein. Wenn Sie sie jedoch hier hinzufügen, wird ein Kompilierungsfehler verursacht ("Unerwartetes Token" in "oder unvollständiger Ausdruck").Anweisung in einem Modul oder einer Klasse. Dies ist auch hier nicht der Fall, der
do
ist innerhalb einer Funktion, nicht innerhalb eines Moduls oder einer Klasse.
Ich habe auch bemerkt, dass mit #light "off"
, wird der Code nicht kompilieren („Unexpected Schlüsselwort‚do‘in binding“), aber ich habe nichts gefunden, die entweder das im Abschnitt über die leichte Syntax erklären würden, .
Basierend auf all dies würde ich davon ausgehen, dass die Verwendung do
innerhalb einer Funktion auf diese Weise nicht kompilieren sollte, aber es tut. Habe ich etwas in der Spezifikation vermisst? Oder ist das eigentlich ein Fehler im Compiler oder in der Spezifikation?
Es wird eine Do-Bindung genannt. Ich konnte es nicht in der Spezifikation finden, aber es ist [dokumentiert auf MSDN] (http://msdn.microsoft.com/en-us/library/dd393786.aspx). – Daniel
@Daniel Das ist der dritte Fall, den ich erwähnt habe, "do" in einem Modul. "Verwenden Sie eine do-Bindung, wenn Sie Code * unabhängig von einer Funktion ausführen möchten." – svick
Um das Zitat zu beenden: _unabhängig von einer Funktion * oder Wertdefinition * ._ Der zweite Fall könnte innerhalb einer Funktion anwendbar sein. – Daniel