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

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

  •  05-07-2019
  •  | 
  •  

Вопрос

В 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 привязывалось бы к объявлению поля в циклической ссылке, что является ошибкой.Исключение позволяет лексическому поиску пропустить объявление поля в этом случае.

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

ОБНОВЛЕНИЕ 2:

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

Есть какие-нибудь идеи?

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

Это было полезно?

Другие советы

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

Text : Text

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

Value : Text

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

Вот в чем проблема:в M вы можете выполнять подобные трюки следующим образом:

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

В этом примере "Адреса" относятся к лицу.Адреса.Таким образом, проблема в том, что когда вы пишете что-то безобидное, например

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

...тогда "Текст" в описании типа для SomethingElse относится не к языку.Text, а к T.Text.И это то, что идет не так.Обходной путь заключается в том, чтобы написать это следующим образом:

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

(Вы можете задаться вопросом, почему такие вещи, как "Текст :Текст " работайте в приведенном выше примере.Есть особое правило:идентификаторы в описании типа поля не могут ссылаться на само поле.Каноническим примером для этого является "Адрес :Адрес".)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top