lisp - 在(emacs)lisp 中提取/切片/重新排序列表?

标签 lisp elisp

在 python 中,你可能会做类似的事情

i = (0, 3, 2)
x = [x+1 for x in range(0,5)]
operator.itemgetter(*i)(x)

获取 (1, 4, 3)。 在 (emacs) lisp 中,我编写了这个名为 extract 的函数,它执行类似的操作,

(defun extract (elems seq)
  (mapcar (lambda (x) (nth x seq)) elems))

(extract '(0 3 2) (number-sequence 1 5))

但我觉得应该内置一些东西?我只知道 first, last, rest, nth, car, cdr... 要走的路是什么? ~ 提前致谢 ~

最佳答案

如果您的问题是速度,则使用 (vector 1 2 3 4 5) 而不是列表,并使用 (aref vec index) 来获取元素。

(defun extract (elems seq)
  (let ((av (vconcat seq)))
    (mapcar (lambda (x) (aref av x)) elems)))

如果您要多次从同一个序列中提取,当然只将序列存储在向量中一次是有意义的。 Python 列表确实是一维数组,LISP 中的等价物是向量。

关于lisp - 在(emacs)lisp 中提取/切片/重新排序列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2901255/

相关文章:

emacs - 全局设置键,但排除特定模式

emacs - 如何向 `format-time-string` 添加格式说明符?

lisp - 当我尝试在 Windows 7 : 'rm' is not recognized 中克隆 HN 时出错

lisp - 如何在普通的 lisp 中实现自然排序?

clojure - 在 Clojure 中,如何 cons 或 conj 集合的元素而不是集合本身?

elisp - 通过 Emacs Lisp 中的函数设置模式

emacs - Emacs 中 forward-word/backward-word 的任意字符

emacs - 将 edebug 用于 elisp 失败,找不到库

lisp - lisp代码的解释

windows - 我怎样才能简单地 "run"lisp 文件