Объяснение ошибки Осло "M0197:" Текст "нельзя использовать в контексте типа"?

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

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

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

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

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

ОБНОВИТЬ:

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

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

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

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

наберите "А; тип B { A: A; }

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

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

UPDATE2:

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

Есть идеи?

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

3 ответа

Решение

Вот проблема: в 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;
  }
}

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

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

Text : Text

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

Value : Text

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

Другие вопросы по тегам