我在 Elisp 中有一个列表。如何返回从第 1 个元素开始的每个第 n 个元素组成的列表?在 Python 中,我有切片符号:
>>> range(10)[::3]
[0, 3, 6, 9]
我在
dash.el
中找不到任何有用的信息列出 API,所以我使用 loop
macro 编写了我的解决方案:(defun step (n xs)
(loop for x in xs by (lambda (xs) (nthcdr n xs))
collect x))
ELISP> (step 3 (number-sequence 0 10))
(0 3 6 9)
顺便说一句,
(lambda (xs) (nthcdr n xs))
可以用 dash.el
重写的部分应用功能 -partial
:(-partial 'nthcdr n)
.loop
宏似乎有点矫枉过正。如何在 Emacs Lisp 中逐步返回元素?
最佳答案
这是一个简短的说明,比较使用 -partial
和一个循环中的普通 lambda:
(require 'cl-lib)
(prog1 nil
(setq bigdata (number-sequence 1 10000)))
(defun every-nth-1 (n xs)
(cl-loop for x in xs by (lambda (xs) (nthcdr n xs))
collect x))
(defun every-nth-2 (n xs)
(cl-loop for x in xs by (-partial 'nthcdr n)
collect x))
(defmacro util-timeit (expr)
(let ((t-beg (float-time))
(res (dotimes (i 1000)
(eval expr)))
(t-end (float-time)))
(/
(- t-end t-beg)
1000)))
(setq time1
(util-timeit
(length (every-nth-1 3 bigdata))))
(setq time2
(util-timeit
(every-nth-2 3 bigdata)))
(message "%s" (/ time2 time1))
调用
eval-buffer
给我一个大约 4 的结果。这意味着(lambda (xs) (nthcdr n xs))
比 (-partial 'nthcdr n)
快 4 倍,至少没有字节编译。
通过字节编译,它在性能上有惊人的 12.2-13.6 倍差异
支持一个普通的 lambda!
关于emacs - 在 Emacs Lisp 中逐步迭代列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22591728/