Emacs Lisp 中的 List comprehension

我在编写 Emacs lisp 的时候总是觉得如果 elisp 也有 类似 python 的lisp comprehension 就好了。

info elisp 没有找到。

于是自己写了一个。 缺点是: 这个小扩展不是标准的,以后每个使用他的 package 都要包含 这么一段,很麻烦。 如果有标准的类似实现就好了。

(defmacro dolist-if ( pair condtion body)
  (list 'let '(result)
        (list 'dolist  (append pair '(result))
              (list 'if condtion
                    (list 'setq 'result
                          (list 'append 'result
                                (list 'list
                                      (list 'progn
                                            body))))))))

使用方法和dolist 类似, 就是没有

 (dolist (var list result) body)
中的 result ,默认的返回值是每次 body 最后一个 expression 的值组成的 list

当然 我增加了条件过滤。格式是

(dolist-if (VAR LIST) COND BODY)

例如:

(dolist-if  (var '(1 2 3 4 5 6 7 8))
            (eq (% var 2) 0)
            var)

找出了所有的偶数

(dolist-if (var (buffer-list))
          (not (or
                (string-match "^\*.*" (buffer-name var))
                (string-match "^ .*"  (buffer-name var))))
          (buffer-name var))

找出了所有 buffer-name 不是 xxx 的 buffer.