2012-01-04 4 views
3

는 I 함수 가지고반응식 infinte 루프 메모리

((lambda (x) (x x)) 
(lambda (x) (x x))) 

을하고 무한 루프를 생성한다. 내 질문은 메모리 맵에 관한 것입니다. 각 호출마다 새 프레임을 열어 스택이 오버플로된다는 것을 알고 있습니다. 하지만 힙은 어떻게 될 것입니까? 내가 이해할 때마다 모든 호출에 대해 힙에 새로운 클로저가 만들어 지지만이 점에 대해서는 확실하지 않습니다.

답변

5

Scheme에서 tail call optimization (또는 이와 동등한 것)을 요구하므로 스택이 오버 플로우되지 않습니다. 새로운 호출 프레임이 작성되지 않습니다. 또한이 함수를 실행하려면 상수 힙 할당 만 필요합니다. 인터프리터는 두 개의 클로저를 생성하는 두 개의 lambda 표현식 만 평가하면됩니다. 메모리를 채워하려면

,

(let loop ((l 0)) 
    (loop (cons l l))) 
+0

같은 일을 할 그래서 루프를 inifinte 온 이유는 무엇입니까? –

+0

논문에서 평가 해보십시오. –

+3

아니요, Scheme은 TCO를 요구하지 않습니다. 적절한 꼬리 호출 (PTC)을 요구합니다. 즉, 제한이없는 꼬리 호출은 제한되지 않은 메모리를 소비 할 수 없습니다. TCO는 PTC를 구현하는 한 가지 방법이지만 "Cheney on the MTA"와 같은 다른 접근 방식이 있습니다. –

관련 문제