шепелявость отфильтровывает результаты списка, не соответствующего предикату

Я пытаюсь изучить шепелявость, с помощью emacs диалект, и у меня есть вопрос. давайте скажем, что список имеет некоторых участников, для которых предикат оценивает ко лжи. как я создаю новый список без тех участников? что-то как { A in L: p(A) is true }. в Python существует функция фильтра, есть ли в шепелявости что-то эквивалентное? в противном случае, как я делаю это?

Спасибо

35
задан Teddy 10 February 2010 в 06:32
поделиться

2 ответа

Эти функции находятся в пакете CL, вам потребуется (require 'cl) для их использования:

(remove-if-not #'evenp '(1 2 3 4 5))

Это вернет новый список со всеми четными числами из аргумента.

Также посмотрите delete-if-not, который делает то же самое, но изменяет список аргументов.

42
ответ дан 27 November 2019 в 06:41
поделиться

Вчера вечером я искал то же самое и наткнулся на 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.
19
ответ дан 27 November 2019 в 06:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: