2014-03-05 10 views
7

나는 함수 프로그래밍의 배경에서 왔으며 반복적 인 문제보다는 반복적 인 문제에 대한 해결책을 먼저 생각해 보았습니다. 나는 Rebol 비트 (특히 R3)를 사용하기 시작했으며 accumulator로 tail-recursive 함수를 사용하여 primefactor kata에 대한 해답을 작성했습니다. 그러나 충분히 큰 입력이 있으면 스택을 끊습니다. AFAIK가 R3에 포팅되지 않은 테일 콜 최적화 (tail-call optimization) 버전을 구현하는 "tail-func.r"이라는 Rebol2 용 스크립트가 있습니다. Rebol 3은 많은 경우 R2와는 다른 방식으로 구현되므로 Rebol 3에서 추가 코드없이 TCO를 얻을 수있는 방법이 있습니까? 그렇지 않다면 이전 스크립트를 이식하지 않고 가져 오는 더 간단한 방법이 있습니까? 죄송합니다,Rebol Tail Call Optimization

primefactors: function [n m factors] [ 
    either n > 1 
    [ either (modulo n m) == 0 
     [ primefactors (n/m) m (append factors m) ] 
     [ primefactors n (m + 1) factors ] ] 
    [ factors ] 
    ] 

    primefactors 30 2 (copy []) => [2 3 5] 
+0

예를 들어 간단한 코드 스 니펫을 제공 할 수 있습니까? – johnk

+0

물론 샘플 샘플을 추가했습니다. – teyvk

답변

3

하지 코드없이 :

내 코드를 추가 수정 됨. Rebol은 컴파일되지 않으므로 꼬리 호출을 구성하는 요소를 정확히 미리 알 수있는 방법이 없습니다. return 함수에 대한 호출조차도 goto가 아니라 신속하게 호출 스택을 전파합니다.

IIRC tail-func의 저자는 지금 Rebol 3에서 작동하며, 그 사람이 포팅을 쉽게 할 수 있는지 여부를 결정합니다. 이제 당신이 언급 했으니 살펴 보겠습니다. 함수 발생기와 전처리 기는 Rebol에서 쉽게 수행 할 수 있습니다.

+0

아, 컴파일되지 않은 부분이 의미가 있습니다. 필자는 코드를 통과하는 최적화 과정을 적어도 한 번 수행 한 다음 중간 결과를 해석하는 구현에 익숙합니다. – teyvk