Filter function in Elisp
Asked Answered
O

2

12

Is there equivalent of higher-order function filter in Emacs Lisp? Like function from python or Javascript.

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

==> (2 4 6 8)
Olette answered 25/9, 2013 at 9:38 Comment(1)
possible duplicate of lisp filter out results from list not matching predicateImpugn
T
14

It's cl-remove-if-not. A bit of a mouthful, but it works.

To elaborate a bit, you need

(require 'cl-lib)

to get this function. There's an alias for it, called remove-if-not, but I prefer not to use it, since it may look like I'm using remove-if-not from cl.

It's a good practice to include the prefix, not doing using namespace std in C++, but saying std::cout each time.

Tanika answered 25/9, 2013 at 9:46 Comment(4)
In Emacs 23, there seems to be a remove-if and remove-if-not not in the cl compatibility package.Ratter
@Ratter Emacs 24 have remove-if and remove-if-not too, you should post it as answer because those are built in.Olette
@Vatine, @jbubic: The remove-if-not in Emacs 23 is part of its CL compatibility features, it's defined in cl-seq.el. It is always available without the need to require anything, though, at least in my experience. Maybe in older Emacs versions, cl-seq.el wasn't loaded by the default configuration?Oneidaoneil
It's not autoloaded in Emacs 24, you have to require cl-lib.Tanika
S
10

The third-party dash.el library provides a -filter function as an alternative to cl-remove-if-not.

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

;; => (2 4 6 8)
Samaritan answered 25/9, 2013 at 19:42 Comment(1)
dash.el is really a must-have library for serious Emacs Lisp programming :)Somaliland

© 2022 - 2024 — McMap. All rights reserved.