Explicação do erro de Oslo “M0197: 'texto' não pode ser usado em um contexto de tipo”?

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

  •  05-07-2019
  •  | 
  •  

Pergunta

No Microsoft Oslo SDK CTP 2008 (usando Intellipad), o seguinte código compila bem:

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

Enquanto a compilação do código abaixo leva ao erro "M0197: 'texto' não pode ser usado em um contexto de tipo"

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

Não vejo a diferença entre os exemplos, como no primeiro caso, o texto também é usado em um contexto de tipo.

ATUALIZAR:

Para adicionar à confusão, considere o exemplo a seguir, que também compila bem:

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

A especificação de idioma M afirma que:

As declarações de campo substituem o escopo lexical para impedir o tipo de ligação de uma declaração à própria declaração. O tipo atribuído de uma declaração de campo não deve ser a própria declaração; No entanto, a declaração pode ser usada em uma restrição. Considere o seguinte exemplo:

tipo A; tipo B {a: a; }

O escopo que inclui lexicamente para a atribuição de tipo da declaração de campo a é a declaração de entidade B. Sem exceção, a atribuição de tipo A se ligaria à declaração de campo em uma referência circular que é um erro. A exceção permite a pesquisa lexical para pular a declaração de campo neste caso.

Parece que tipos definidos pelo usuário e tipos internos (intrínsecos) não são tratados iguais.

Update2:

Observe que Valor No exemplo acima, não é uma palavra -chave reservada. O mesmo erro resulta se você renomear Valor para Y.

Alguma ideia?

Atenciosamente, Tamberg

Outras dicas

Pelo que estou vendo, você redefiniu Text:

Text : Text

E então você está tentando usá -lo para o tipo de valor:

Value : Text

o que não é permitido. Por que o uso de um nome de tipo como propriedade redefine um tipo que não estou totalmente claro (ainda lendo M Specification Language), mas tenho certeza de que há uma boa razão para isso. Apenas nome Text Algo que ainda não é um tipo definido (escapando com colchetes ([Text]) também não funciona).

Aqui está o problema: em M, você pode fazer truques como este:

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

Nesse exemplo, "endereços" refere -se a pessoa. O problema, então, é que quando você escreve algo inócuo como

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

... Então o "texto" na atribuição de tipo para algo que se refere não ao idioma.text, mas para t.Text. E é isso que está dando errado. A solução alternativa é escrever assim:

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

(Você pode se perguntar por que coisas como "texto: texto" funcionam no exemplo acima. Há uma regra especial: identificadores na atribuição de tipo de um campo não podem se referir ao próprio campo. O exemplo canônico para este é "endereço: endereço".)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top