#elisp 리스트에서 요소(element) 여러 개를 삭제

/emacsian/assets/2020-07-18-elisp-how-to-delete-a-list-of-elements-from-list-00.jpg

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 체커를 삭제했다.

참고

C-x C-s C-x C-c


크리에이티브 커먼즈 라이선스


Published: July 18 2020


Feedback plz <3 @ohyecloudy, ohyecloudy@gmail.com