단일 인수와 쉼표로 인용 포인트는 무엇입니까? (인용, 인수) 않지만 within ,앞에 추가 하면 평가됩니다.

(quote x)x는 평가되지 않지만 within ,앞에 추가 하면 평가됩니다. 그렇다면 앞에 쉼표가있는 단일 인수로 인용을 사용하는 요점은 무엇입니까 ?xquote(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매크로가 호출되는 환경에 정의되어 있지 않기 때문에 오류 입니다.