단일 인수와 쉼표로 인용 포인트는 무엇입니까? (인용, 인수)


15

(quote x)x는 평가되지 않지만 within ,앞에 추가 하면 평가됩니다. 그렇다면 앞에 쉼표가있는 단일 인수로 인용을 사용하는 요점은 무엇입니까 ?xquote(quote ,x)

성가신 화살표에서 라인 59로 동기 부여 :

(put (quote ,cmd) 'aa--alts ,alternatives)

(put cmd 'aa-alts ,alternatives)똑같이 좋지 않습니까?

답변:


20

쉼표는 역 따옴표 (일명 유사 인용 ) 목록 의 맥락에서 사용 되므로 목록의 일부를 선택적으로 평가할 수 있습니다. 역 따옴표 사용에 대한 예제 는 이 스레드 를 참조하십시오 .

몇 가지 간단한 예 :

(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.


1
Ackey, 앞에 인용 부호는 progn얼마나 멀리 중첩되어 있더라도 평가하고자하는 것들 앞에 쉼표를 넣어야한다는 것을 의미합니다. (이것은 ,cmd다른리스트 안에 있으며, 직접적으로는 아닙니다 (progn).)
The Unfun Cat

테스트 해 볼 수있는 좋은 기회 인 것 같습니다! 평가 (setq a "a's value" b "b's value" c "c's value")한 다음 평가 해보십시오 `(a '(,b c)).
Dan

기타 새로운 기능 : 평가하려면 텍스트를 스크래치 버퍼에 추가 한 다음 줄 끝에 커서를 놓고 Cxe를 누릅니다.
Unfun Cat

11

매크로 안에 있기 때문입니다. 매크로는 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매크로가 호출되는 환경에 정의되어 있지 않기 때문에 오류 입니다.


이것은 또한 훌륭한 설명입니다. 철자 해 주셔서 감사합니다.
The Unfun Cat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.