2013-06-30 3 views
8

짧은 backquote와 긴 backquote 사이에 약간의 차이가있는 것 같습니다.중첩 backquote와`in emacs lisp

(let ((x 123)) 
    (dolist (res (list `(a `(b ,x)) 
        `(a (backquote (b ,x))) 
        (backquote (a (backquote (b ,x)))) 
        (backquote (a `(b ,x))))) 
    (print res))) 

출력 :

(a (\` (b (\, x)))) 

(a (backquote (b 123))) 

(a (backquote (b 123))) 

(a (\` (b (\, x)))) 

왜 X에 관해서는 다르게 행동 하는가? 네 가지 결과 중 두 가지가 놀라운 결과라고 생각하는지조차 알지 못합니다.

+0

이들은 실제로 백틱입니다. –

+0

나는 이것이 'backquote.el'의 버그라고 생각합니다. 아래 내 의견을 참조하십시오. –

답변

3

버그 또는 기능인지 확실하지 않습니다. 주로 프로그래머가 backquote 함수를 사용하도록 허용되었거나 잘 정의되어 있는지 잘 모르므로, 또는이를 정의하는 편리한 방법 일뿐입니다. 기능. 올바른 출력은 첫 번째 (네 번째) 출력입니다. backquote (backquote.el)의 코드를 보면 '또는 backquote에있는 backquote이 제대로 확장되지 않았 음을 알 수 있습니다. 이에 대한 관련 코드는 다음과 같습니다

backquote-backquote-symbol는 '\'(따옴표 - 백 슬래시 - 역 따옴표)로 이전에 정의
((eq (car s) backquote-backquote-symbol) 
     (backquote-delay-process s (1+ level))) 

. 이이 오류를 처리하는 방법은 여러 가지가 있지만 라인은 다음과 같을 수

((or (eq (car s) backquote-backquote-symbol) 
     (eq (car s) 'backquote)) 
     (backquote-delay-process s (1+ level))) 

(또는 역 인용 부호 unaliased 기호를 지정하는 다른 변수를 사용하여).

EDIT : 더 자세히 살펴보면 다른 곳에서도 테스트를 추가 할 수 있지만 여기에는 패치보고가 포함됩니다. 내가 어떻게하는지 알게 될거야. 그 변경 내용은 다음과 같습니다 :

ELISP> (macroexpand-all `(a (backquote (b ,x)))) 
(a 
(list 'b x)) 
ELISP> (macroexpand-all `(a `(b ,x))) 
(a 
(list 'b x)) 
관련 문제