(quote x)
x는 평가되지 않지만 within ,
앞에 추가 하면 평가됩니다. 그렇다면 앞에 쉼표가있는 단일 인수로 인용을 사용하는 요점은 무엇입니까 ?x
quote
(quote ,x)
성가신 화살표에서 라인 59로 동기 부여 :
(put (quote ,cmd) 'aa--alts ,alternatives)
왜 (put cmd 'aa-alts ,alternatives)
똑같이 좋지 않습니까?
답변
쉼표는 역 따옴표 (일명 유사 인용 ) 목록 의 맥락에서 사용 되므로 목록의 일부를 선택적으로 평가할 수 있습니다. 역 따옴표 사용에 대한 예제 는 이 스레드 를 참조하십시오 .
몇 가지 간단한 예 :
(setq a "a's value" b "b's value" c "c's value")
'(a b c) ; => (a b c)
`(,a b ,c) ; => ("a's value" b "c's value")
당신이 말하는 쉼표 는 거꾸로 인용 된 매크로 정의에 있습니다 progn
:
(defmacro add-annoying-arrows-advice (cmd alternatives)
`(progn
(add-to-list 'annoying-commands (quote ,cmd))
(put (quote ,cmd) 'aa--alts ,alternatives)
(defadvice ,cmd (before annoying-arrows activate)
(when annoying-arrows-mode
(aa--maybe-complain (quote ,cmd))))))
,cmd
역 따옴표 내에서 cmd
기호 대신 값을 제자리 에 놓을 수 있습니다 cmd
.
답변
매크로 안에 있기 때문입니다. 매크로는 Lisp 양식을 반환해야하며, 그런 다음 평가 양식을 가져옵니다.
예를 들어,이 매크로의 첫 번째 호출을 살펴보십시오.
(add-annoying-arrows-advice previous-line '(ace-jump-mode backward-paragraph isearch-backward ido-imenu smart-up))
다음을 포함하는 확장이 필요합니다.
(put 'previous-line 'aa-alts '(ace-jump-mode backward-paragraph isearch-backward ido-imenu smart-up))
이것이 (quote ,cmd)
달성하는 것입니다. 매크로가 cmd
대신 일반을 사용하면 문자 그대로 유지되며 확장은 다음과 같습니다.
(put cmd 'aa-alts '(ace-jump-mode backward-paragraph isearch-backward ido-imenu smart-up))
cmd
매크로가 호출되는 환경에 정의되어 있지 않기 때문에 오류 입니다.