Я пытаюсь изучить шепелявость, с помощью emacs диалект, и у меня есть вопрос. давайте скажем, что список имеет некоторых участников, для которых предикат оценивает ко лжи. как я создаю новый список без тех участников? что-то как { A in L: p(A) is true }
. в Python существует функция фильтра, есть ли в шепелявости что-то эквивалентное? в противном случае, как я делаю это?
Спасибо
Эти функции находятся в пакете CL, вам потребуется (require 'cl)
для их использования:
(remove-if-not #'evenp '(1 2 3 4 5))
Это вернет новый список со всеми четными числами из аргумента.
Также посмотрите delete-if-not
, который делает то же самое, но изменяет список аргументов.
Вчера вечером я искал то же самое и наткнулся на Elisp Cookbook на EmacsWiki. Раздел Lists/Sequences содержит методы фильтрации и показывает, как это можно сделать с помощью mapcar
и delq
. Мне пришлось изменить код, чтобы использовать его в своих целях, но вот оригинал:
;; Emacs Lisp doesn’t come with a ‘filter’ function to keep elements that satisfy
;; a conditional and excise the elements that do not satisfy it. One can use ‘mapcar’
;; to iterate over a list with a conditional, and then use ‘delq’ to remove the ‘nil’
;; values.
(defun my-filter (condp lst)
(delq nil
(mapcar (lambda (x) (and (funcall condp x) x)) lst)))
;; Therefore
(my-filter 'identity my-list)
;; is equivalent to
(delq nil my-list)
;; For example:
(let ((num-list '(1 'a 2 "nil" 3 nil 4)))
(my-filter 'numberp num-list)) ==> (1 2 3 4)
;; Actually the package cl-seq contains the functions remove-if and remove-if-not.
;; The latter can be used instead of my-filter.