2011-09-24 4 views
2

저는 파이썬과 sapid lisp 자체에서 작은 lisp 해석기 (Google 코드에서 sapid lisp)를 구현했습니다. 아마도 주요 특징은 예외를 통해 꼬리 및 상호 재귀 최적화를 구현하는 것입니다. 구현 세부 사항은 여기 https://sites.google.com/site/sapidlisp/recursion-optimization입니다.예외를 통해 꼬리 재귀 최적화를 설명하는 참조 찾기

표준 기술보다 장점은 꼬리 재귀 최적화를 얻기 위해 재귀 적 해석기에 적용되는 제한적인 변경 사항입니다. 단점은 타이밍 일 수 있습니다.

나는 파이썬 장식 자 (http://code.activestate.com/recipes/474088/)에서 사용 된 비슷한 기술을 발견했습니다. 이제이 기술을 그 맥락에서 설명하기 위해 나는 혀짤음이나 다른 해석 언어에 대한 기술을 설명하는 참고 문헌을 찾고있다. 어떠한 정보?

+0

여기에 제안 된 기술은 플라이 테일 재귀 호출을 명시적인 while 루프로 변환합니다. 비 재귀 꼬리 호출에 적용 할 방법이 없습니다. 이런 이유로, 태그의 변경이 관련이 있는지 확신하지 못합니다. 내가 잘못? –

답변

4

참조 엘리의 답변을. 그러나 좀 더 많은 컨텍스트를 추가하기 위해 Baker의 Cheney on the M.T.A. 기술은 연속 프레임 및 기타 개체에 대해 C 스택을 보육 (generational GC 에서처럼)으로 사용한 적절한 테일 재귀를 구현하는 데 잘 알려진 트릭이었습니다. 스택을 작게 유지하는 것보다 (이 기술은 꼬리 재귀의 대부분 구현에서 그렇듯이) 잠시 동안 스택을 성장시킨 다음 큰 점프 (longjmp, execption, 무엇이든간에)로 한 번씩 지울 수 있습니다. 그리고 스택을 지우기 전에 모든 라이브 내용을 힙으로 복사합니다.

스택을 추적하고 스택에서 힙으로 객체를 복사 할 수 있다면 기꺼이 작동합니다. Eli가 인용 한 논문 (Generalized Stack Inspection의 Continuation)은 스택을 직접 검사 할 수없는 "관리"플랫폼에 트릭을 적용하는 것에 관한 것입니다.

+0

베이커의 기술을 설명하고 Pettyjohn의 논문을이 맥락에서 다루는 데 대해 감사드립니다. –