Werfen Sie einen Blick auf die folgenden zwei Ausdrücke:Wie unterscheidet Swift Typargumente in Ausdruckskontexten?
baz(Foo<Bar, Bar>(0))
baz(Foo < Bar, Bar > (0))
Ohne zu wissen, was, baz
, Foo
und Bar
sind (baz
ein Typ oder ein Verfahren sein kann, Foo
und Bar
können Arten oder Variablen sein), gibt es Es gibt keine Möglichkeit zu disambiguieren, ob <
eine Typargumentliste oder einen Kleiner-als-Operator darstellt.
// two different outcomes, difference shown with parentheses
baz((Foo<Bar,Bar>(0))) // generics
baz((Foo < Bar), (Bar > 0)) // less-than
verlassen Jede Sprache sane Programmierung sollte nicht auf, was baz
, Foo
und Bar
werden, wenn diese einen Ausdruck wie das Parsen. Dennoch gelingt es Swift den unten Ausdruck egal eindeutig zu machen, wo ich Leerzeichen setzen:
println(Dictionary<String, String>(0))
println(Dictionary < String, String > (0))
Wie funktioniert der Compiler diese verwalten? Und, noch wichtiger, gibt es in der Swift-Sprachspezifikation einen Platz. wo die Regeln dafür beschrieben sind. Blick durch den Language Reference
Teil des Swift Buchs, fand ich nur diesen Abschnitt:
In bestimmten Konstruktionen, Operatoren mit einem führenden
<
oder>
kann in zwei oder mehr Token aufgeteilt werden. Der Rest wird auf die gleiche Weise behandelt und kann erneut aufgeteilt werden. Daher ist es nicht erforderlich, Leerräume zu verwenden, um zwischen den abschließenden Zeichen in Konstrukten wieDictionary<String, Array<Int>>
zu disambiguieren. In diesem Beispiel werden die abschließenden>
Zeichen nicht als ein einzelnes Token behandelt, das dann als Bit-Shift-Operator falsch interpretiert werden kann.
Was bedeutet certain constructs
in diesem Zusammenhang? Die eigentliche Grammatik enthält nur eine Produktionsregel, die Typargumente erwähnt:
explizite-Mitglied Ausdruck → Postfix-Ausdruck
.
identifiergeneric-Argument-Klausel opt
Jede Erklärung oder Ressource wäre sehr geschätzt.
Beachten Sie, dass der Swift-Compiler Open Source ist. Hier finden Sie einen Überblick über die Architektur und Links zum Quellcode: https://swift.org/compiler-stdlib/#compiler-architecture. –