Spiegazione dell'errore di Oslo "M0197:" Testo "non può essere utilizzato in un contesto di tipo"?

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

  •  05-07-2019
  •  | 
  •  

Domanda

In Microsoft Oslo SDK CTP 2008 (utilizzando Intellipad) il seguente codice viene compilato correttamente:

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

durante la compilazione del codice seguente porta all'errore " M0197: "Testo" non può essere utilizzato in un contesto di tipo "

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

Non vedo la differenza tra gli esempi, poiché nel primo caso il testo viene utilizzato anche in un contesto di tipo.

UPDATE:

Per aggiungere confusione, considera il seguente esempio, che compila anche bene:

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

Le specifiche della lingua M indicano che:

  

Le dichiarazioni di campo hanno la precedenza sull'ambito lessicale per impedire il tipo di dichiarazione vincolante per la dichiarazione stessa. Il tipo attribuito di una dichiarazione di campo non deve essere la dichiarazione stessa; tuttavia, la dichiarazione può essere utilizzata in un vincolo. Considera il seguente esempio:

     

tipo A;   tipo B {       AA;   }

     

L'ambito di inclusione lessicale della descrizione del tipo della dichiarazione di campo A è la dichiarazione dell'entità B. Senza alcuna eccezione, la descrizione del tipo A si legherebbe alla dichiarazione di campo in un riferimento circolare che è un errore. L'eccezione consente alla ricerca lessicale di saltare la dichiarazione di campo in questo caso.

Sembra che i tipi definiti dall'utente e i tipi incorporati (intrinseci) non siano trattati allo stesso modo.

UPDATE2:

Nota che Valore nell'esempio sopra non è una parola chiave riservata. Lo stesso errore si verifica se si rinomina Valore in Y .

Qualche idea?

Saluti, tamberga

Altri suggerimenti

Da quello che vedo hai ridefinito Testo :

Text : Text

e quindi stai tentando di usarlo per il tipo di valore:

Value : Text

che non è permesso. Perché usare un nome di tipo come proprietà ridefinisce un tipo di cui non sono del tutto chiaro (sto ancora leggendo le specifiche del linguaggio M), ma sono sicuro che ci sia una buona ragione per questo. Basta nominare Text qualcosa che non sia già un tipo definito (sfuggirlo tra parentesi ( [Text] ) non funziona neanche).

Ecco il problema: in M, puoi fare trucchi come questo:

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

In questo esempio, " Indirizzi " si riferisce a Person.Addresses. Il problema, quindi, è che quando scrivi qualcosa di innocuo come

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

... quindi il " Testo " nella descrizione tipo per SomethingElse non si riferisce a Language.Text, ma a T.Text. Ed è quello che non va. La soluzione è scrivere in questo modo:

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

(Potresti chiederti perché cose come "Testo: Testo" funzionano nell'esempio sopra. C'è una regola speciale: gli identificatori nell'attribuzione del tipo di un campo non possono riferirsi al campo stesso. L'esempio canonico per questo è " Indirizzo: indirizzo ").

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top