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

hat*_*rix 6 lisp elisp

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

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

得到(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))
Run Code Online (Sandbox Code Playgroud)

但我觉得应该有内置的东西?我所知道的是first, last, rest, nth, car, cdr......走的路是什么?〜提前谢谢〜

650*_*502 4

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

(defun extract (elems seq)
  (let ((av (vconcat seq)))
    (mapcar (lambda (x) (aref av x)) elems)))
Run Code Online (Sandbox Code Playgroud)

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