푸시와리스트에 추가의 차이점은 무엇입니까?


26

설치 지침의 다른 패키지가 push 또는 add-to-list (예 : load-path에 디렉토리 추가)를 사용하고 차이점과 각 사용 사례가 무엇인지 궁금합니다.


1
을 사용 add-to-list하여 코드를을 사용 하여 코드 로 변환하는 데 어려움을 겪고 cl-pushnew있었고이 블로그 게시물이 상당히 밝아졌습니다. yoo2080.wordpress.com/2013/09/11/…
dangom

답변:


21

#zck가 언급 한 것은 한 가지 차이점입니다. 그 유일한 차이점이라면하지만 당신에 대해 질문을 할 수 cl-pushnewadd-to-list.

또 다른 중요한 차이점 add-to-list은 함수입니다. 즉, 모든 인수, 특히 첫 번째 인수를 평가합니다. push매크로 (있는 그대로 cl-pushnew)-두 번째 인수를 평가하지 않습니다. 대신 일반화 된 장소로 해석합니다.

예를 들어, 두 번째 인수가 기호이면 변수로 간주되고 첫 번째 인수의 값은 해당 기호의 값에 변수로 간주되며 변수는 새로운 단점으로 설정됩니다.

doc 문자열 add-to-list은 다음 과 같이 말합니다.

This is handy to add some elements to configuration variables,
but please do not abuse it in Elisp code, where you are usually
better off using `push' or `cl-pushnew'.

6
바이트-컴파일러에 따르면 :add-to-list can't use lexical var ...; use push or cl-pushnew
Malabarba

(push (5 6) my-list)여전히 오류가 발생합니다- 5함수가 아닙니다. 이 add-to-list행동 과 어떻게 다른 가요?
markasoftware

@markasoftware : 무엇을하려고합니까? 목록 (5 6)을 변수 (값) 로 푸시하려면 목록 my-list을 작성해야합니다 (5 6). 이를 수행하는 한 가지 방법은 사용하는 것입니다 '(5 6). 다른 하나는 사용하는 것 (list 5 6)입니다. push인수를 평가합니다.
Drew

@Drew는 이제 논증을 평가한다고 말했지만 당신의 대답은 문자 그대로 "첫 번째 논증을 평가하지 않습니다"라고 말하는데, 이것이 내 혼란의 근원입니다.
markasoftware

@markasoftware : 죄송합니다. 나는 오타가 있었다-나는 "두 번째 인수"를 써야 할 "첫 번째 인수"를 썼다. 지금 수정되었습니다-감사합니다. 두 번째 인수 push는 변수와 같은 장소입니다. 첫 번째 인수는 해당 변수의 값에 따라 평가되며 변수는 새로운 단점으로 설정됩니다. add-to-list값이 업데이트되는 변수를 생성하기 위해 첫 번째 인수를 평가합니다. push업데이트 할 변수 인 두 번째 인수를 평가하지 않습니다. 인수 순서는 둘 사이에서 반대로됩니다.
드류

15

또 다른 차이점 :

pushlist 의 시작 부분에 요소 를 추가 합니다 .

add-to-listlist 의 시작 또는 끝에 요소 를 추가 할 수 있습니다 .

(setq testasdf nil)

(push 'a testasdf)

testasdf
(a)

(add-to-list 'testasdf 'b)

testasdf
(b a)

;; add element to the end
(add-to-list 'testasdf "hello" t)

testasdf
(b a "hello")

14

로부터 이맥스 문서 , 또는 C-h f push:

매크로 : 푸시 요소 목록 이름

이 매크로는 car가 element이고 cdr이 listname으로 지정된 목록 인 새 목록을 작성하고 해당 목록을 listname에 저장합니다.

같은 페이지에서 또는 C-h f add-to-list:

기능 : 목록에 추가 기호 요소 및 선택적 추가 비교 -fn

이 함수는 element가 아직 해당 값의 멤버가 아닌 경우 element를 이전 값으로 구성하여 변수 기호를 설정합니다.

따라서 add-to-list요소가없는 경우에만 푸시합니다.


cl-pushnew처럼 동작 add-to-list합니다.
sam boosalis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.