#elisp 리스트에서 요소(element) 여러 개를 삭제
ELISP> (delete 'c '(a b c d))
(a b d)
delete
함수로 리스트에서 요소 한 개를 삭제할 수 있다. 여러 개를 삭제하고 싶다면 다른 함수를 조합해서 해결해야 한다. 요소 여러 개를 삭제할 수 있는 리스트 조작 함수는 없다.
ELISP> (setq source '(a b c d e))
(a b c d e)
ELISP> (mapcar (lambda (x) (setq source (delete x source))) '(b d))
((a c e)
(a c e))
ELISP> source
(a c e)
시퀀스 요소 마다 함수를 적용해 리스트를 만들어내는 mapcar
함수를 사용할 수 있다. mapcar
함수는 함수와 시퀀스를 인자로 받는다. 시퀀스로 삭제할 요소 리스트를 입력하고 함수에서 사이드 이팩트를 일으켜 요소를 삭제한다. ((a c e) (a c e))
리턴 값을 보면 찝찝하다. 이러라고 만든 mapcar
함수가 아닌 것 같다. 원소에 함수를 적용한 결과를 리스트로 리턴하는 map이다.
ELISP> (setq source '(a b c d e))
(a b c d e)
ELISP> (mapc (lambda (x) (setq source (delete x source))) '(b d))
(b d)
사이드 이팩트를 만드는 목적으로 사용하는 함수가 있다. mapc
함수. 이름이 좀 무성의하다. 사이드 이팩트로 리스트에서 원소를 삭제하겠다는 의도 전달이 확실하므로 mapcar
함수 대신 mapc
함수를 사용하는 게 낫다.
(use-package flycheck
:init
;; erlang은 flycheck에서 제외
(mapc (lambda (x) (setq flycheck-checkers (delete x flycheck-checkers))) '(erlang-rebar3 erlang))
(global-flycheck-mode))
이제 리스트에서 여러 개를 삭제할 수 있다. flycheck 체커에서 erlang-rebar3, erlang 체커를 삭제했다.
참고
- How to delete a list of elements from another list in ELisp? - stackoverflow.com
- 5.7 Using Lists as Sets - gnu.org/software/emacs
- 13.6 Mapping Functions - gnu.org/software/emacs
C-x C-s C-x C-c