令我惊讶的是,我发现自己在emacs lisp中遗漏的一件事是一些特殊的列表操作。我想念Python的简明列表切片。
>>> mylist = ["foo", "bar", "baz", "qux", "frobnitz"]
>>> mylist[1:4]
['bar', 'baz', 'qux']
我在emacs文档中看到了函数butlast
和nthcdr
,它们可以从这样的代码中得到相同的结果:
(setq mylist '("foo" "bar" "baz" "qux" "frobnitz"))
(butlast (nthcdr 1 mylist) 1)
;; ("bar" "baz" "qux")
获取列表切片的方法是否比合并butlast
和nthcdr
更简洁?
答案 0 :(得分:22)
当然有:
(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"
答案 1 :(得分:3)
Common Lisp library很棒,但是如果你的代码库变大了,并且你想用功能样式编写简洁的代码,我支持dash.el
库,它为列表和树操作提供了大量的功能。有一个函数-slice
的行为就像Python的切片:
(-slice (number-sequence 1 10) 1 7 2) ; (2 4 6)
参数按顺序排列:列表,开始,(可选)停止,(可选)步骤。