Found an issue with the book? Report it on Github.

룩업 규칙(Lookup Rules)

룩업 규칙(Lookup Rules)

컨텐츠 구성(Organizing Content) 에 대한 내용을 다룰 때의 다음 예제를 기억해 보겠습니다.

within ModelicaByExample.PackageExamples;
package NestedPackages
  "An example of how packages can be used to organize things"
  package Types
    type Rabbits = Real(quantity="Rabbits", min=0);
    type Wolves = Real(quantity="Wolves", min=0);
    type RabbitReproduction = Real(quantity="Rabbit Reproduction", min=0);
    type RabbitFatalities = Real(quantity="Rabbit Fatalities", min=0);
    type WolfReproduction = Real(quantity="Wolf Reproduction", min=0);
    type WolfFatalities = Real(quantity="Wolf Fatalities", min=0);
  end Types;

  model LotkaVolterra "Lotka-Volterra with types"
    parameter Types.RabbitReproduction alpha=0.1;
    parameter Types.RabbitFatalities beta=0.02;
    parameter Types.WolfReproduction gamma=0.4;
    parameter Types.WolfFatalities delta=0.02;
    parameter Types.Rabbits x0=10;
    parameter Types.Wolves y0=10;
    Types.Rabbits x(start=x0);
    Types.Wolves y(start=y0);
  equation
    der(x) = x*(alpha-beta*y);
    der(y) = -y*(gamma-delta*x);
  end LotkaVolterra;
end NestedPackages;

패키지 내용 참조(Referencing Package Contents) 에 대해 논의할 때 제시된 예제는 참조하는 모든 자료형에 대해 정규화된 이름을 사용했습니다. 그러나 위의 예제는 그렇지 않습니다. LotkaVolterra 모델에서 Wolves 자료형이 다음과 같이 참조되는 것을 볼 수 있습니다.

parameter Types.Wolves y0=10;

위에서 보인 형태는 다음과 같은,

parameter ModelicaByExample.PackageExamples.NestedPackages.Types.Wolves y0=10;

정규화된 이름을 사용하지 않았습니다. 하지만 LotkaVolterra 모델은 잘 컴파일됩니다.그렇다면 모델리카 컴파일러가 사용할 Wolves 정의를 어떻게 알 수 있을까요?

답은 모델리카의 "이름 조회"와 관련이 있습니다.모델리카 이름 조회는 사전에 정의되어진 이름에 대한 검색이 포함됩니다. 모델리카 자료형의 이름은 일반적으로 정규화된 이름입니다(반드시 완전한 정규화된 이름은 아님). 즉, 예: Modelica.SIunits.Voltage 와 같이 . 가 포함될 수 있습니다. 이름과 관련된 일치하는 정의를 찾기 위해 모델리카 컴파일러는 정규화된 이름에서 첫 번째 이름(예: * Modelica)을 찾는 것으로 시작합니다.다음 순서로 일치하는 정의를 검색합니다.:

  1. 내장 자료형 중에서 일치하는 이름을 찾습니다.

  2. 현재 정의에서 이름이 일치하는 중첩된 정의를 찾습니다(상속된 정의 포함)

  3. 현재 정의에서 이름이 일치하는 가져온 정의를 찾습니다(상속된 가져오기는 포함하지 않음)

  4. 일치하는 이름(상속된 정의 포함)이 있는 중첩된 정의에 대한 현재 정의의 상위 패키지를 찾습니다.

  5. 부모 패키지에서 이름이 일치하는 가져온 정의를 찾습니다(상속된 가져오기 제외)

  6. 다음 중 하나가 될 때까지 각 연속 부모를 살펴봅니다(동일한 접근 방식 사용).:

    • 상위 패키지에는 encapsulated 한정자가 있으며 이 경우 검색이 종료됩니다.

    • 더 이상 상위 패키지가 없는 경우, 이 경우 루트 수준 패키지 까지 일치하는 항목을 검색함.

이러한 위치를 모두 검색한 후에도 지정된 이름을 찾을 수 없으면 검색에 실패하고 자료형을 확인할 수 없습니다. 검색에 성공하했다는 것은 정규화된 이름에서 그 이름 의 정의를 찾은 것입니다. 이름이 정규화되지 않은 경우(즉, 이름에 . 가 없는 경우)에는 그것으로 완료된 것입니다. 그러나 이름에 다른 구성 요소가 있는 경우 이 구성 요소는 검색에서 반환된 정의 내에 포함된 중첩이여야 합니다.정규화된 이름의 나머지 모든 구성 요소에 대해 중첩된 정의를 찾을 수 없으면 검색이 실패하고 자료형을 확인할 수 없습니다.

처음에는 이것이 매우 복잡하게 들릴 수 있는데, 대부분의 경우 이러한 규칙은 그다지 중요하지 않습니다. 그 이유는 앞에서 설명한 것처럼 그래픽 모델리카 환경에서 대부분이 정규화된 이름을 사용하기 때문입니다.모델리카 코드의 자료형 이름은 로컬 정의를 참조하거나 정규화된 이름으로 지정됩니다.