Explicación del error de Oslo "M0197: 'Texto' no se puede usar en un contexto de Tipo"?

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

  •  05-07-2019
  •  | 
  •  

Pregunta

En Microsoft Oslo SDK CTP 2008 (con Intellipad), el siguiente código se compila correctamente:

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

mientras se compila el siguiente código, se produce el error " M0197: 'Texto' no se puede usar en un contexto de Tipo "

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

No veo la diferencia entre los ejemplos, ya que en el primer caso, el texto también se usa en un contexto de Tipo.

ACTUALIZACIÓN:

Para agregar a la confusión, considere el siguiente ejemplo, que también se compila:

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

La especificación del lenguaje M establece que:

  

Las declaraciones de campo anulan el alcance léxico para evitar que el tipo de una declaración vincule a la declaración en sí. El tipo asignado de una declaración de campo no debe ser la declaración en sí; sin embargo, la declaración puede ser usada en una restricción. Considere el siguiente ejemplo:

     

tipo A;   tipo B {       A: A;   }

     

El ámbito que encierra léxicamente para la asignación de tipo de la declaración de campo A es la declaración de la entidad B. Sin excepción, la asignación de tipo A se uniría a la declaración de campo en una referencia circular que es un error. La excepción permite que la búsqueda léxica omita la declaración de campo en este caso.

Parece que los tipos definidos por el usuario y los tipos incorporados (intrínsecos) no se tratan igual.

ACTUALIZACIÓN2:

Tenga en cuenta que Valor en el ejemplo anterior no es una palabra clave reservada. Se produce el mismo error si cambia el nombre de Valor a Y .

¿Alguna idea?

Saludos, tamberg

Otros consejos

Por lo que veo, ha redefinido Text :

Text : Text

y luego intenta usarlo para el tipo de Valor:

Value : Text

que no está permitido. Por qué el uso de un nombre de tipo como propiedad redefine un tipo en el que no estoy del todo claro (aún estoy leyendo la especificación del lenguaje M), pero estoy seguro de que hay una buena razón para ello. Solo el nombre de Text que no sea un tipo definido (escapar entre corchetes ( [Text] ) tampoco funciona).

Aquí está el problema: en M, puedes hacer trucos como este:

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

En ese ejemplo, " Direcciones " se refiere a person.Addresses. El problema, entonces, es que cuando escribes algo inocuo como

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

... luego el " Texto " en la inscripción de tipo para SomethingElse se refiere no a Language.Text, sino a T.Text. Y eso es lo que va mal. La solución es escribirlo así:

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

(Puede que se pregunte por qué las cosas como "Texto: Texto" funcionan en el ejemplo anterior. Hay una regla especial: los identificadores en la descripción del tipo de campo no pueden referirse al campo en sí. El ejemplo canónico para esto es "Dirección: Dirección " ;.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top