Symbol element & optional append compare-fn
add-to-list는 리스트 항목에 새로운 항목을 추가 할때 사용합니다.
만약 리스트 항목의 맴버가 아니라면 그 리스트 항목 맨 앞에 값을 추가합니다.
그리고 업데이트 후 리스트 값을 반환하며, 그게 아니라면 기존 리스트 값만 반환합니다.
add-to-list 부르기 전에 심볼의 값은 리스트가 되는 것이 낫습니다. ??
add-to-list는 리스트에 존재하는 맴버변수를 대비하여 비교 연산을 하기 위해 compare-fn을 사용합니다.
만약 compare-fn이 nil이면 equal 함수를 사용합니다.
일반적으로 element가 추가되었다면, 기존 심볼 앞에 추가가 됩니다. 하지만 추가적인 argument로 nil을 추가하게 되면 맨 뒤에 붙게 됩니다.
그 argument 심볼은 절대적이지 않습니다;
add-to-list는 set 과 비슷하고, setq와 비슷하지 않은
정식 함수입니다.
그 argument 는 당신이 원하는대로 사용할 수 있습니다.
아래는 add-to-list를 사용하기 위한 몇가지 시나리오입니다.
[code]
(setq foo '(a b))
-> (a b)
(add-to-list 'foo 'c) ;; c 가 추가되었습니다.
-> (c a b)
(add-to-list 'foo 'c) ;; 아무 변화 없습니다.
-> (c a b)
(add-to-list 'foo 'b) ;; foo 심볼이 변경 되었습니다.
-> (c a b)
[/code]
add-to-list를 동등한 표현으로 아래와 같이 할 수 있습니다.
[code]
(or (member value var)
(setq var (cons value var)))
[/code]
원문