2015-02-04 10 views
0

:스칼라 컴파일러의 유래 보호 내가 할 수있는 런타임에서

def X(R: Any): Any = X(R) 

그러나 컴파일 시간에 simmilar 일을 할 수 없습니다

scala> type X[R] = X[R] 
<console>:11: error: illegal cyclic reference involving type X 
     type X[R] = X[R] 
       ^

는 무한 루프/재귀 보호처럼 보이지만까지로 나는 Halting problem을 이해한다 - 탐지기 자체가 멈추지 않을 수 있기 때문에 turing-complete 언어에 대한 무한 재귀를 탐지 할 수있는 일반적인 방법이 없으므로 추가 컴파일러 검사는 일반적으로 여기에서 작동하지 않는다.

그래서 scalac에서 무한 재귀를 얻을 수있는 방법이 있습니까? 그리고 illegal cyclic reference을 가지고있는 다른 이유가 있습니까? (그러한 재귀를 방지하는 것보다) 이유가 있습니까?

답변

0

다형성과 함께 재귀를 사용하여 scalac에 StackOverflow에 얻을 수있는 교묘 한 방법이있다 : 컴파일러 R#X[R]Re 호출하고 있다고 생각하지만, type X을 계산할 때 실제로 ReRe이 통과 되었기 때문에 그것은 작동

scala> trait Re { type X[R <: Re] } 
warning: there were 1 feature warning(s); re-run with -feature for details 
defined trait Re 

scala> trait ReRe extends Re {type X[R <: Re] = R#X[R]} 
defined trait ReRe 

scala> type X = ReRe#X[ReRe] 
java.lang.StackOverflowError 

가.

illegal cyclic reference의 목적에 대해 알지 못합니다. 아마도 컴파일러 내부의 무한 루프에서만 보호 할 수 있지만, 무한 재귀 (turing-completeness가 비 꼬리 재귀를 사용하여 구현 된 경우)가 아닙니다.