Lassen Bindungen Interpunktion in Doppel-Backticks enthalten, aber Typen nicht?

8

In Visual Studio 2012 wird mit F # folgender Code kompiliert:

%Vor%

Aber dieser Code nicht:

%Vor%

Gemäß Abschnitt 3.4 der F # -Sprachspezifikation :

%Vor%

In Abschnitt 5 wird der Typ wie folgt definiert:

%Vor%

... und Abschnitt 4.2 definiert lang-ident als:

%Vor%

Soweit ich das aus der Spezifikation ersehen kann, werden Typen mit Long-Idents und Long-Idents mit Idents bezeichnet. Da IDs Interpunktion mit doppeltem Backtick-Anführungszeichen unterstützen, scheint es, dass auch Typen dies tun sollten.

Also habe ich die Spezifikation falsch gelesen? Oder ist das ein Compiler Bug?

    
Marty Dill 20.10.2012, 05:12
quelle

1 Antwort

12

Es sieht definitiv so aus, als wäre die Spezifikation nicht mit der tatsächlichen Implementierung synchronisiert, daher gibt es einen Fehler auf der einen oder der anderen Seite.

Wenn Sie den Bezeichner in Double-Backticks verwenden, behandelt der Compiler ihn als Namen und generiert einfach den Typ (oder das Member) mit dem Namen, den Sie in Backticks angegeben haben. Es macht keinen Namen Mangling, um sicherzustellen, dass der Bezeichner gültiger Typ / Mitgliedsname ist.

Dies bedeutet, dass es nicht zu überraschend ist, dass Sie keine Bezeichner verwenden können, die mit einer Standardbedeutung im kompilierten Code kollidieren würden. In Ihrem Beispiel ist es Punkt, aber hier sind ein paar andere Beispiele:

%Vor%

Die obigen Beispiele sind nicht als Typnamen erlaubt (weil sie mit einer Standardbedeutung kollidieren), aber Sie können sie in Let-Bindings verwenden, weil es keine solchen Einschränkungen für Variablennamen gibt:

%Vor%

Dies ist definitiv etwas, das in der Dokumentation & amp; die Spezifikation, aber ich hoffe, dass dies hilft zu klären, was vor sich geht.

    
Tomas Petricek 20.10.2012, 14:23
quelle

Tags und Links