2013-09-25 17 views
10

Esiste l'equivalente della funzione di ordine superiore filter in Emacs Lisp? Come la funzione di Python o Javascript.Funzione filtro in Elisp

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

==> (2 4 6 8) 
+1

possibile duplicato di [Filtro Lisp fuori risultati da elenco non corrispondenti predicato] (http://stackoverflow.com/questions/2234860/lisp-filter-out-results-from-list-not-matching-predicate) –

risposta

12

È cl-remove-if-not. Un po 'di boccone, ma funziona.

Elaborare un po ', è necessario

(require 'cl-lib) 

per ottenere questa funzione. C'è un alias per questo, chiamato remove-if-not, ma Preferisco non usarlo, dal momento che può sembrare che sto usando remove-if-not da cl.

È buona norma includere il prefisso, non facendo using namespace std in C++, ma dicendo std::cout ogni volta.

+1

In Emacs 23, sembra esserci un 'remove-if' e' remove-if-not' non nel pacchetto di compatibilità cl. – Vatine

+0

@Vatine Emacs 24 hanno 'remove-if' e' remove-if-not', dovresti postarlo come risposta perché sono integrati. – jcubic

+0

@Vatine, @jbubic: il 'remove-if-not' in Emacs 23 fa parte delle sue caratteristiche di compatibilità CL, è definito in 'cl-seq.el'. È sempre disponibile senza la necessità di "richiedere" nulla, anche se, almeno nella mia esperienza. Forse nelle vecchie versioni di Emacs, 'cl-seq.el' non è stato caricato dalla configurazione di default? –

11

La libreria di terze parti dash.el fornisce una funzione -filter in alternativa a cl-remove-if-not.

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

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

dash.el è davvero una libreria indispensabile per la programmazione Lisp di Emacs :) – lunaryorn