2016-07-21 4 views
4

Emacs lisp는 LISP의 방언이며, 특히 Scheme입니다. 대부분의 스킴 인터프리터는 Tail Recursion을 최적화하지만 emacs는 그렇지 않다. 나는`info elisp '에서 그 이유를 잠시 동안 찾았지만 찾지 못했습니다.Emacs lisp에서 tail 재귀 최적화가없는 이유는 무엇입니까?

P. 예, 'while'과 같이 elisp에는 다른 반복 구문이 있지만 다른 구조 해석기와 같이 꼬리 재귀를 구현하지 않은 좋은 이유를 찾을 수 없습니다.

+3

elisp가 특히 스킴과 관련이 있다는 인상을주었습니다. 입맞춤들이 가면서 두 사람은 매우 다릅니다. – phils

+4

그것은 Scheme의 방언이 아닙니다. 그것은 Lisp의 방언이고 대부분의 Lisp 방언은 꼬리 재귀를하지 않습니다. – Barmar

+3

아마도 1970 년대의 Maclisp와 가장 밀접한 관련이 있습니다. 꼬리 재귀가 없었습니다. – Barmar

답변

9

Emacs Lisp는 1980 년대에 만들어졌습니다. Emacs 저자 (Richard Stallman)가 당시에 가장 잘 알고 있던 Lisp 방언은 MIT Maclisp였으며 Emacs Lisp는 그와 매우 유사합니다. 동적 변수 범위 지정을 사용했고 어휘 폐쇄 또는 꼬리 재귀 최적화가 없었으며 Emacs Lisp도 동일합니다.

Emacs Lisp는 Scheme과 매우 다릅니다. 가장 큰 차이점은 Scheme은 어휘 적으로 범위가 지정되어 있지만 Emacs Lisp에 추가 된 것은 최근에 추가 된 것이므로 파일 단위로 활성화해야합니다 (첫 번째 줄에 ;;; -*- lexical-binding: t -*-을 넣음). 기본값을 지정하면 많은 비 호환성이 발생하기 때문에 .

Emacs Lisp를 Scheme 방언 인 Guile으로 대체하려는 작업이 있습니다. 그러나 결실을 맺을 지 여부는 분명하지 않습니다.

+4

아마도 당신은 elisp 인터프리터가 속임수로 대체되는 속임수 이맥스 프로젝트의 마지막 단락을 언급하고있는 것 같습니다. 그것은 elisp를 체계로 대체하는 것이 아닙니다. 요점은 elisp을 직접 지원하기 위해 만들어 졌다는 것입니다. 그게 당신이 생각한 것이라면, 사실 엄청난 노력이 프로젝트에 들어갔습니다. 비록 실제로 GNU Emacs의 일부가 될 수있는 시점까지 성숙해 왔는지는 아무도 예상하지 못했습니다. – phils

+0

@phils 감사합니다. 마지막 단락을 개정했습니다. – Barmar

5

Emacs Lisp는 처음 25 년 동안 주/유일한 범위 지정 규칙으로 동적 범위 지정을 사용했습니다. 동적 범위 지정은 기본적으로 꼬리 - 재귀 최적화와 호환되지 않기 때문에이 최적화에서 Emacs-24 (렉시 컬 범위 지정을 도입 한)까지 거의 관심을 보이지 않았습니다.

요즘에는 ELisp가 꼬리 재귀를 최적화 할 때 종종 도움이 될 수 있으며 일부 패치가 제출되었지만 아직 통합되지 않았습니다. 꼬리 - 재귀 최적화의 부족과 함수 호출의 상대적으로 비효율적 인 구현은 재귀가 자주 사용되지 않도록 ELisp 스타일에 영향을 주었고, 차례로 꼬리 호출의 최적화를 추가 할 때의 이점이 줄어 들었습니다.

3

누군가가 이맥스 Lisp에서 TCO를 구현 한 것처럼 보입니다 : https://github.com/Wilfred/tco.el. 나는 그것으로 직접 연주하지는 않았지만 Emacs Lisp에서 TCO를보고 싶다면 소용돌이 치고 싶을 수도있다.

관련 문제