Объяснение ошибки Осло «M0197:« Текст »нельзя использовать в контексте типа»? - PullRequest
0 голосов
/ 31 октября 2008

В Microsoft Oslo SDK CTP 2008 (с использованием Intellipad) прекрасно компилируется следующий код:

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

при компиляции приведенного ниже кода приводит к ошибке «M0197:« Текст »нельзя использовать в контексте типа»

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

Я не вижу разницы между примерами, так как в первом случае текст также используется в контексте типа.

UPDATE:

Чтобы добавить путаницу, рассмотрим следующий пример, который также прекрасно компилируется:

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

Спецификация языка M гласит:

Объявления полей переопределяют лексическую область видимости, чтобы тип объявления не связывался с самим объявлением. Приписываемый тип объявления поля не должен быть самим объявлением; однако объявление может использоваться в ограничении. Рассмотрим следующий пример:

тип А; тип B { A: A; }

Лексически заключенная область видимости для описания типа объявления поля A - это объявление объекта B. Без исключения, тип записи A связывается с объявлением поля в циклической ссылке, что является ошибкой. Исключение позволяет лексическому поиску пропустить объявление поля в этом случае.

Кажется, что определяемые пользователем типы и встроенные (встроенные) типы не рассматриваются как равные.

UPDATE2:

Обратите внимание, что Значение в приведенном выше примере не является зарезервированным ключевым словом. Та же ошибка возникает, если вы переименуете Значение в Y .

Есть идеи?

С уважением, Тамберг

Ответы [ 3 ]

1 голос
/ 01 ноября 2008
1 голос
/ 31 января 2009

Вот проблема: в M вы можете делать такие трюки, как это:

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

В этом примере «Адреса» относятся к Person.Addresses. Проблема в том, что когда вы пишете что-то безобидное, например

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

... тогда «Текст» в типовой надписи для SomethingElse относится не к Language.Text, а к T.Text. И вот что идет не так. Обходной путь должен написать это так:

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

(Вы можете задаться вопросом, почему такие вещи, как «Текст: Текст», работают в приведенном выше примере. Существует специальное правило: идентификаторы в надписи типа поля не могут ссылаться на само поле. .)

1 голос
/ 31 октября 2008

Из того, что я вижу, вы пересмотрели Text:

Text : Text

и затем вы пытаетесь использовать его для типа значения:

Value : Text

что не разрешено. Почему использование имени типа в качестве свойства переопределяет тип, который мне не совсем понятен (я все еще читаю спецификацию языка M), но я уверен, что для этого есть веская причина. Просто назовите Text что-то, что еще не является определенным типом (экранирование в скобках ([Text]) также не работает).

...