#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.
- Почему приведенный выше пример возвращает
nil
вместо('CA)
?
Спасибо за всю помощь!
Редактировать:
Я вижу, что если я изменю свое определение states
, чтобы не заключать записи в кавычки, то то, что я написал, сработает.
Ответ №1:
Не заключайте список в кавычки. Достаточно просто процитировать список:
(defvar states '( (USA PA) (USA VA) (USA CA) ))
Возвращаемое значение в этом случае равно:
((USA CA))