Oslo 오류에 대한 설명“M0197 : 'Text'는 유형 컨텍스트에서 사용할 수 없습니다”?

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

  •  05-07-2019
  •  | 
  •  

문제

Microsoft Oslo SDK CTP 2008 (Intellipad 사용)에서 다음 코드는 잘 구성됩니다.

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

아래 코드를 컴파일하는 동안 "M0197 : 'Text'는 유형 컨텍스트에서 사용할 수 없습니다"오류로 이어집니다.

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

첫 번째 사례 텍스트에서도 유형 컨텍스트에서도 사용되는 예제 간의 차이가 보이지 않습니다.

업데이트:

혼란에 추가하려면 다음 예제를 고려하십시오.

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

M 언어 사양은 다음을 나타냅니다.

필드 선언은 선언 자체에 대한 선언의 유형을 방지하기 위해 어휘 스코핑을 무시합니다. 필드 선언의 유형이 선언 자체가되어서는 안됩니다. 그러나 선언은 제약으로 사용될 수 있습니다. 다음 예를 고려하십시오.

유형 A; 유형 B {a : a; }

필드 선언 a의 유형 표현에 대한 어휘를 둘러싸는 범위는 엔티티 선언 B입니다. 예외적으로, 유형의 유형 A는 오류 인 순환 참조에서 필드 선언에 바인딩됩니다. 예외를 통해 어휘 조회는이 경우 필드 선언을 건너 뛸 수 있습니다.

사용자 정의 유형과 내장 (내장) 유형은 동일하게 처리되지 않은 것 같습니다.

Update2 :

주목하십시오 위의 예에서는 예약 된 키워드가 아닙니다. 이름 바꾸면 동일한 오류가 발생합니다 에게 와이.

어떤 아이디어?

안부, 탐버그

다른 팁

내가보고있는 것에서 당신이 재정의했습니다 Text:

Text : Text

그런 다음 가치 유형에 사용하려고합니다.

Value : Text

허용되지 않습니다. 유형 이름을 속성으로 사용하면 전적으로 명확하지 않은 유형을 재정의하는 이유 (여전히 M 언어 사양을 읽고 있음) 그러나 그에 대한 좋은 이유가 있다고 확신합니다. 그냥 이름 Text 아직 정의 된 유형이 아닌 것 (브래킷으로 탈출하는 것)[Text])도 작동하지 않습니다).

문제는 다음과 같습니다. 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;
  }
}

( "텍스트 : 텍스트"와 같은 것들이 위의 예제에서 작업하는 이유를 궁금해 할 수 있습니다. 특별 규칙이 있습니다. 필드의 유형에 식별자가 필드 자체를 참조 할 수 없습니다. 이에 대한 정식 예는 "주소 : 주소"입니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top