2013-09-25 18 views
10

Czy istnieje odpowiednik funkcji wyższego rzędu filter w Emacs Lisp? Podobnie jak funkcja z Pythona lub Javascript.Funkcja filtra w Elisp

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

==> (2 4 6 8) 
+1

możliwe duplikat [lisp odfiltrowania wyników z listy nie pasujące predykatu] (http://stackoverflow.com/questions/2234860/lisp-filter-out-results-from-list-not-matching-predicate) –

Odpowiedz

12

To jest cl-remove-if-not. Trochę łyka, ale działa.

Aby rozwinąć trochę, trzeba

(require 'cl-lib) 

aby uzyskać tę funkcję. Jest na to alias, zwany remove-if-not, ale Wolę go nie używać, ponieważ może wyglądać tak, jakbym używał remove-if-not z cl.

Dobrze jest dołączyć przedrostek, nie wykonując using namespace std w C++, , ale za każdym razem mówiąc: std::cout.

+1

W Emacs 23, wydaje się, że w pakiecie zgodności cl znajdują się 'remove-if' oraz' remove-if-not'. – Vatine

+0

@Vatine Emacs 24 ma również opcję "remove-if" i "remove-if-not", powinieneś opublikować ją jako odpowiedź, ponieważ są one wbudowane. – jcubic

+0

@Vatine, @jbubic: 'remove-if-not' w Emacs 23 jest częścią jego funkcji zgodności z CL, jest zdefiniowany w 'cl-seq.el'. Jest to zawsze dostępne bez potrzeby "niczego", przynajmniej w moim doświadczeniu. Może w starszych wersjach Emacsa 'cl-seq.el' nie został załadowany przez domyślną konfigurację? –

11

Zewnętrzna biblioteka dash.el udostępnia funkcję -filter jako alternatywę dla cl-remove-if-not.

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

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

dash.el to naprawdę niezbędna biblioteka do poważnego programowania Emacs Lisp :) – lunaryorn