фильтрация списка с помощью elisp remove-if

#emacs #filter #functional-programming #elisp

#emacs #Фильтр #функциональное программирование #elisp

Вопрос:

Для фильтрации списка с помощью emacs lisp следует использовать remove-if функцию. Ниже приведена документация для remove-if:

 remove-if is an alias for `cl-remove-if' in `cl.el'.

(remove-if PREDICATE SEQ [KEYWORD VALUE]...)

Remove all items satisfying PREDICATE in SEQ.
This is a non-destructive function; it makes a copy of SEQ if necessary
to avoid corrupting the original SEQ.

Keywords supported:  :key :count :start :end :from-end
  

Вот пример того, что remove-if действует не так, как я думаю, должно:

 (defvar states '( ('USA 'PA) ('USA 'VA) ('USA 'CA) ))
(remove-if (lambda (row) (not (equal (cadr row) 'CA))) states)
  

Я хочу, чтобы это должно было вернуться ('CA) , но этого не происходит. Вместо этого он возвращает nil.

  1. Почему приведенный выше пример возвращает nil вместо ('CA) ?

Спасибо за всю помощь!

Редактировать:

Я вижу, что если я изменю свое определение states , чтобы не заключать записи в кавычки, то то, что я написал, сработает.

Ответ №1:

Не заключайте список в кавычки. Достаточно просто процитировать список:

 (defvar states '( (USA PA) (USA VA) (USA CA) ))
  

Возвращаемое значение в этом случае равно:

 ((USA CA))