23

令人惊讶的是,我发现自己在 emacs lisp 中缺少的一件事是列表操作的特殊位。我想念 Python 的简洁列表切片。

>>> mylist = ["foo", "bar", "baz", "qux", "frobnitz"]
>>> mylist[1:4]
['bar', 'baz', 'qux']

我在 emacs 文档中看到了这些函数butlastnthcdr它们会从如下代码中得到相同的结果:

(setq mylist '("foo" "bar" "baz" "qux" "frobnitz"))
(butlast (nthcdr 1 mylist) 1)
;; ("bar" "baz" "qux")

有没有比合并butlastand更简洁的获取列表切片的方法nthcdr

4

2 回答 2

23

当然有:

(require 'cl-lib)
(setq mylist '("foo" "bar" "baz" "qux" "frobnitz"))
(cl-subseq mylist 1 4)
;; ("bar" "baz" "qux")

在现代 Emacs 中,请注意cl已弃用,请参阅在 Emacs 中,此错误是什么意思?“警告:运行时需要 cl 包”

于 2012-11-01T22:27:43.387 回答
5

Common Lisp 库很棒,但如果你的代码库变得很大,并且你想以函数式风格编写简洁的代码,我支持dash.el库,它提供了大量用于列表和树操作的函数。有一个函数-slice的行为就像 Python 的切片:

(-slice (number-sequence 1 10) 1 7 2) ; (2 4 6)

参数按顺序排列:列表、开始、(可选)停止、(可选)步骤。

于 2014-08-03T16:51:30.673 回答