문제

저는 실험적인 언어에 대한 통역사를 작성 중입니다.언어의 주요 구성 요소 중 세 가지는 정의, 명령문 및 표현입니다.정의에는 명령문과 표현식이 포함될 수 있고 명령문에는 정의와 표현식이 포함될 수 있으며 한 종류의 표현식에는 명령문이 포함될 수 있습니다.나는 패턴 매칭을 쉽게 사용할 수 있도록 공용체 유형을 사용하여 이러한 모든 것을 표현합니다.이상적으로는 이러한 코드를 다른 파일에 넣고 싶지만 OMake는 순환 종속성 문제에 대해 불평합니다.내가 아는 한, 모듈 전체에 걸쳐 순환 유형 정의는 허용되지 않습니다.

이 문제를 해결하기 위해 제가 아는 유일한 방법은 세 가지 유형을 모두 한 번에 정의하는 것입니다.

type defn = ...
and stmt = ...
and expr = ...

유형에 대한 모든 코드가 동일한 파일에 있어야 하는 것 같습니다.이 문제를 해결할 방법이 있나요?코드에서 순환 정의를 어떻게 처리합니까?

도움이 되었습니까?

해결책

재귀 정의는 동일한 파일에 나타나야 합니다.정의, 명령문 및 표현식을 별도의 모듈로 분리하려면 다음을 사용하면 됩니다. 재귀 모듈, 하지만 여전히 동일한 파일에 나타나야 합니다.DAG를 통해 파일 간 종속성을 확인하는 것은 OCaml의 성가신 문제 중 하나입니다.

다른 팁

이는 참조하는 유형에 대해 유형을 매개변수화하여 쉽게 해결됩니다.

type ('stmt, 'expr) defn = ...
type ('defn, 'expr) stmt = ...
type ('defn, 'stmt) expr = ...

이 기술은 "재귀 매듭 풀기"(고르디우스의 매듭과 관련하여)라고 하며 OCaml 저널 기사.

건배, Jon Harrop.

자주 사용되는 또 다른 솔루션은 인터페이스의 유형을 추상화하는 것입니다.유형은 인터페이스에서 추상적이므로 이러한 인터페이스는 재귀적으로 종속되지 않습니다.구현에서 유형을 지정할 수 있으며 구현은 인터페이스에만 의존하므로 재귀적이지도 않습니다.

유일한 문제는 이 솔루션을 사용하면 구현 외부에서 이러한 유형에 대해 더 이상 패턴 일치를 수행할 수 없다는 것입니다.

개인적으로는 취향의 문제일지도 모르겠습니다. 저는 모든 유형의 프로그램을 하나의 모듈에 정의하는 것을 좋아합니다(프로그램의 가독성에 도움이 된다고 생각합니다).따라서 OCaml의 이러한 제한은 나에게 실제로 문제가 되지 않습니다.

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