Erklärung von Oslo Fehlern „M0197:‚Text‘kann nicht in einem Typ-Kontext verwendet werden“?

StackOverflow https://stackoverflow.com/questions/253666

  •  05-07-2019
  •  | 
  •  

Frage

In Microsoft Oslo SDK CTP 2008 (mit IntelliPad) der folgende Code kompiliert fein:

module M {
    type T {
        Text : Text;
    }
}

, während die unter Kompilieren von Code führt zu dem Fehler „M0197:‚Text‘kann nicht in einem Typ-Kontext verwendet werden“

module M {
    type T {
        Text : Text;
        Value : Text; // error
    } 
}

Ich sehe nicht den Unterschied zwischen den Beispielen, wie im ersten Fall Text auch in einer Art Kontext verwendet wird.

UPDATE:

, um die Verwirrung hinzuzufügen, betrachten Sie das folgende Beispiel, das auch in Ordnung kompiliert:

module M {
    type X;
    type T {
      X : X;
      Y : X;
    } 
}

Die M-Sprachspezifikation lautet:

  

Feld Erklärungen außer Kraft setzen lexikalische Scoping den Typen einer Erklärung an die Erklärung selbst verbindlich zu verhindern. Die zugeschriebene Art einer Felddeklaration darf nicht die Erklärung selbst; jedoch kann die Erklärung in einem Constraint verwendet werden. Betrachten Sie das folgende Beispiel:

     

Typ A;   Typ B {       A: A;   }

     

Der lexikalisch umschließenden Umfang für den Typen Zuschreibung der Erklärung Eines Feldes ist die Entitätsdeklaration B. Ohne Ausnahme, bindet die Art ascription A würde in einer kreisförmigen Bezugnahme auf die Felddeklaration, die ein Fehler vorliegt. Die Ausnahme erlaubt lexikalischen Nachschlag die Felddeklaration in diesem Fall zu überspringen.

Es scheint, dass Benutzertypen definiert und integrierten (intrinsische) Typen werden nicht gleich behandelt werden.

UPDATE2:

Beachten Sie, dass Wert in dem obigen Beispiel ist nicht ein reserviertes Schlüsselwort. Die gleichen Fehler auf, wenn Sie umbenennen Wert Y .

Irgendwelche Ideen?

Regards, Tamberg

Andere Tipps

Von dem, was ich sehe Sie neu definiert Text haben:

Text : Text

und dann versuchen Sie es für die Art von Wert zu verwenden:

Value : Text

das ist nicht erlaubt. Warum einen Typnamen als eine Eigenschaft, eine Art definiert Ich bin nicht ganz klar (noch M-Sprachspezifikation zu lesen), aber ich bin sicher, es gibt einen guten Grund dafür. Nennen Sie Text etwas, das nicht bereits eine definierte Art (Entkommen mit Klammern ([Text]) funktioniert auch nicht).

Hier ist das Problem: in M, können Sie Tricks, wie dies tun:

module M
{
  type Address;
  type Person
  {
    Addresses : Address*;
    FavoriteAddress : Address where value in Addresses;
  }  
}

In diesem Beispiel „Adressen“ bezieht sich auf Person.Addresses. Das Problem ist also, dass, wenn Sie etwas schreiben harmlos wie

module M
{
  type T
  {
    Text : Text;
    SomethingElse : Text;
  }
}

... dann wird der „Text“ in der Art Zuschreibung für somethingelse bezieht sich nicht auf Language.Text, sondern T.Text. Und das ist, was falsch läuft. Die Abhilfe ist es so zu schreiben:

module M
{
  type T
  {
    Text : Text;
    SomethingElse : Language.Text;
  }
}

(Sie fragen sich vielleicht, warum die Dinge wie. „Text: Text“ Arbeit im Beispiel oben gibt es eine Sonderregel:. Identifikatoren in einer Art Zuschreibung Feld nicht auf das Gebiet beziehen sich die kanonische Beispiel hierfür ist „Adresse: Address“ ).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top