是否有一个简洁的emacs lisp相当于Python的[n:m]列表切片?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否有一个简洁的emacs lisp相当于Python的[n:m]列表切片?相关的知识,希望对你有一定的参考价值。

令我惊讶的是,我发现自己在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")

获取列表切片比组合butlastnthcdr有更简洁的方法吗?

答案

当然有:

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

在现代Emacs中,请注意cl已被弃用,请参阅In Emacs, what does this error mean? "Warning: cl package required at runtime"

另一答案

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

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

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

以上是关于是否有一个简洁的emacs lisp相当于Python的[n:m]列表切片?的主要内容,如果未能解决你的问题,请参考以下文章

检查字符串是不是以 Emacs Lisp 中的后缀结尾

如何使用 Emacs Lisp 检查文件是不是存在?

分析行为不端的 Emacs Lisp 的提示?

在 emacs lisp 中使用 let 和 flet

请教,关于emacs写lisp自动补全的设置

2020-03-01emacs 中使用LISP