2013-09-25 3 views
10

Есть ли эквивалент функции более высокого порядка filter в Emacs Lisp? Как функция из python или Javascript.Функция фильтра в Elisp

(filter-equivalent (lambda (n) (= (% n 2) 0)) '(1 2 3 4 5 6 7 8)) 

==> (2 4 6 8) 
+1

возможно дубликат [LISP отфильтровывать результаты из списка, не соответствующего предиката] (http://stackoverflow.com/questions/2234860/lisp-filter-out-results-from-list-not-matching-predicate) –

ответ

12

Это cl-remove-if-not. Немного глоток, но он работает.

Выработать немного, вам нужно

(require 'cl-lib) 

, чтобы получить эту функцию. Там есть псевдоним, который называется remove-if-not, но Я предпочитаю не использовать его, так как может показаться, что я использую remove-if-not от cl.

Рекомендуется использовать префикс, не делая using namespace std в C++, , но говоря std::cout каждый раз.

+1

В Emacs 23, похоже, в пакете совместимости cl есть 'remove-if' и' remove-if-not'. – Vatine

+0

@Vatine Emacs 24 имеют 'remove-if' и' remove-if-not' тоже, вы должны отправить его как ответ, потому что они встроены. – jcubic

+0

@Vatine, @jbubic: 'remove-if-not' в Emacs 23 является частью его функций совместимости CL, он определен в 'cl-seq.el'. Он всегда доступен без необходимости «требовать» что угодно, хотя, по крайней мере, в моем опыте. Может быть, в старых версиях Emacs 'cl-seq.el' не был загружен конфигурацией по умолчанию? –

11

Сторонняя библиотека dash.el предоставляет функцию -filter в качестве альтернативы cl-remove-if-not.

(-filter 'evenp '(1 2 3 4 5 6 7 8)) 

;; => (2 4 6 8) 
+1

dash.el действительно обязательная библиотека для серьезных программ Emacs Lisp :) – lunaryorn

Смежные вопросы