최근 버전의 Emacs는 elisp 코드의 변수에 대한 어휘 바인딩을 지원합니다. 어휘 적으로 함수를 재정의 할 수 있습니까? 즉, Emacs Lisp는 lexical-flet
과 같은 것을 가지고 있습니까?emacs lisp는 어휘 적으로 함수를 재정의 할 수 있습니까?
답변
이맥스 < 24.3에서는 (require 'cl)
을 입력하고 labels
을 사용할 수 있습니다. Emacs-24.3 이상에서는 (require 'cl-lib)
을 수행 한 다음 cl-flet
또는 cl-labels
을 사용할 수 있습니다.
모두 기본 매크로가 로컬 함수 정의를 기본적으로 지원하지 않기 때문에이 매크로는 모두 (let ((fun (lambda (args) (body)))) ... (funcall fun my-args) ...)
인 코드를 생성하는 "복잡한 매크로"입니다.
가 labels
입니다하지만 당신이 찾고있는 거라면 나도 몰라 :
(defun foo()
42)
(defun bar()
(foo))
(list
(foo)
(bar)
(labels ((foo()
12))
(list (foo)
(bar)))
(foo)
(bar))
이 (42 42 (12 42) 42 42)
를 반환합니다.
나에게 24.2.1은 "Symbol의 함수 정의는 무효입니다 : 레이블" –
"(require 'cl)'을 반환합니다. 최근 버전이 있다면'(cl-labels ...)'를 사용하십시오. – Hugh
docstring은 "바인딩은 어휘 적이라는 것을 제외하고는"flet과 같습니다 "라고 말합니다. 그게 내가 원하는거야. 감사! –
좀 더 완성되어 전체 배경을 제공하므로 필자는이 답변을 받아 들인 대답으로 전환하고 있습니다. –