2013-09-25 83 views
10

Emacs Lisp中的高階函數filter等價嗎?像來自python或Javascript的函數一樣。Elisp中的過濾函數

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

==> (2 4 6 8) 
+1

可能重複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-notcl

這是一個很好的做法,包括前綴,而不是在C++中做using namespace std, 但每次都說std::cout

+1

在Emacs 23中,似乎有一個'remove-if'和'remove-if-not'不在cl兼容包中。 – Vatine

+0

@Vatine Emacs 24有'remove-if'和'remove-if-not',你應該將它作爲回答發佈,因爲它們是內置的。 – jcubic

+0

@Vatine,@jbubic:Emacs中的'remove-if-not' 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